做网站开发或者维护后台系统时,经常会遇到数据一多查询就卡的情况。比如用户登录慢、订单查不出来,表面看是程序问题,其实可能是数据库缺了合适的索引。而索引能不能起作用,关键就在于创建时的语法写对了没有。
什么是索引?简单说就是数据库的“目录”
就像查字典前先看拼音索引一样,数据库给字段加了索引,就能跳过全表扫描,直接定位数据。但索引不是随便加的,得用正确的语法告诉数据库:你在哪个表、哪个字段上建索引,用什么方式建。
MySQL 中最常见的索引创建语法
在 MySQL 里,最常用的语句是 CREATE INDEX。比如你有个用户表 user_info,想在手机号 phone 字段上建个索引,写法如下:
CREATE INDEX idx_phone ON user_info (phone);
这里 idx_phone 是你给索引起的名字,别太长也别重复;user_info 是表名,phone 是字段名。这样以后按手机号查用户,速度会明显提升。
复合索引怎么写?顺序很重要
有时候一个字段不够用,比如要同时查姓氏和城市。这时候可以建复合索引:
CREATE INDEX idx_name_city ON users (last_name, city);
注意顺序:这个索引对 last_name 单独查询有效,也能用于 last_name + city 联合查询,但如果只查 city,就用不上这个索引。所以字段顺序得按实际查询习惯来排。
唯一索引防止重复数据
有些字段不允许重复,比如身份证号、邮箱。可以用 UNIQUE 关键字创建唯一索引:
CREATE UNIQUE INDEX uk_email ON users (email);
一旦有人插入相同邮箱,数据库就会报错阻止,相当于自动加了一道数据校验关。
建索引也要看表引擎和字段类型
如果是 MyISAM 或 InnoDB 表,支持普通B树索引。如果字段是文本类型,比如文章内容,想模糊查找关键词,可以用全文索引:
CREATE FULLTEXT INDEX ft_title_content ON articles (title, content);
这种索引配合 MATCH() AGAINST() 使用,在搜索站内文章时特别有用。
别忘了主键和外键也算索引
定义主键的时候,数据库会自动创建唯一索引。比如建表语句里写了 PRIMARY KEY(id),那就不用再为 id 单独建索引了。外键字段虽然不自动建索引,但建议手动加上,否则关联查询时容易变慢。
语法写错可能白忙一场
常见错误比如拼错表名、括号没闭合、字段不存在。还有的人在高频更新字段上建索引,结果每次改数据都要重建索引,反而拖慢写入速度。索引不是越多越好,得结合查询频率和数据变化情况权衡。
掌握正确的索引创建语法,就像给数据库装上导航系统。查得快了,服务器压力小了,用户也不会总抱怨“怎么又卡住了”。