MySQL索引分类
单值索引
即一个索引只包含单个列,一个表可以有多个单列索引,语法:
随表一起建索引:
1 | CREATE TABLE customer ( |
单独建单值索引
1 | CREATE INDEX idx_customer_name ON customer(customer_name); |
删除索引
1 | DROP INDEX idx_customer_name on customer; |
唯一索引
索引列的值必须唯一,但允许有空值,语法:
随表一起建索引:
1 | CREATE TABLE customer ( |
单独建唯一索引:
1 | CREATE UNIQUE INDEX idx_customer_no ON customer(customer_no); |
删除索引:
1 | DROP INDEX idx_customer_no on customer ; |
主键索引(聚集索引)
设定为主键后数据库会自动建立索引,innodb为聚簇索引,语法:
随表一起建索引
1 | CREATE TABLE customer ( |
单独建主键索引
1 | CREATE TABLE customer2 ( |
1 | ALTER TABLE customer2 add PRIMARY KEY customer2(id); |
删除主键索引
1 | ALTER TABLE customer2 drop PRIMARY KEY ; |
修改主键索引
必须先删除掉(drop)原索引,再新建(add)索引
复合索引
即一个索引包含多个列,语法:
随表一起建索引:
1 | CREATE TABLE customer ( |
单独建索引:
1 | CREATE INDEX idx_customer_no_name ON customer(customer_no,customer_name); |
删除索引:
1 | DROP INDEX idx_customer_no_name on customer ; |
小结
哪些情况需要创建索引
- 主键自动建立唯一索引
- 频繁作为查询条件的字段应该创建索引
- 查询中与其它表关联的字段,外键关系建立索引
- 单键/组合索引的选择问题,who?(在高并发下倾向创建组合索引)
- 查询中排序的字段,排序字段若通过索引去访问将大大提高排序速度
- 查询中统计或者分组字段
哪些情况不要创建索引
表记录太少,300 万数据时 MySQL 性能就开始下降了,这时就可以开始开始优化了
经常增删改的表,提高了查询速度,同时却会降低更新表的速度,如对表进行 INSERT、UPDATE 和 DELETE。因为更新表时,MySQL 不仅要保存数据,还要保存一下索引文件
where 条件里用不到的字段
数据重复过滤性不好的字段
本文采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 ShiGuang
评论