持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第10天,点击查看活动详情
增加索引是我们常见的提高查询效率提高数据库的性能的一种方式,什么是索引呢?
索引是一种使记录有序化的技术,它可以指定按某列/某几列预先排序,从而大大提高查询速度(类似于汉语词典中按照拼音或者笔画查找)。
索引类型
从物理存储角度上,索引可以分为聚集索引和非聚集索引。
1. 聚集索引(Clustered Index):聚集索引决定数据在磁盘上的物理排序,一个表只能有一个聚集索引。
2. 非聚集索引(Non-clustered Index):非聚集索引并不决定数据在磁盘上的物理排序,索引上只包含被建立索引的数据,以及一个行定位符 row-locator,这个行定位符,可以理解为一个聚集索引物理排序的指针,通过这个指针,可以找到行数据。
从逻辑角度,索引可以分为以下几种。
普通索引:最基本的索引,它没有任何限制。
唯一索引:与普通索引类似,不同的就是索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。
主键索引:它是一种特殊的唯一索引,用于唯一标识数据表中的某一条记录,不允许有空值,一般用 primary key
来约束。主键和聚集索引的关系详见“问题详解”中的第4题。
联合索引(又叫复合索引):多个字段上建立的索引,能够加速复合查询条件的检索。
全文索引:老版本 MySQL 自带的全文索引只能用于数据库引擎为 MyISAM 的数据表,新版本 MySQL 5.6 的
InnoDB 支持全文索引。默认 MySQL 不支持中文全文检索,可以通过扩展
MySQL,添加中文全文检索或为中文内容表提供一个对应的英文索引表的方式来支持中文。
常见的索引优化规则以及注意事项
1.前导模糊查询不能使用索引,如 select * from consult_patient where name like '%xx' ;非前导模糊查询则可以使用索引,如select * from consult_patient where name like 'xx%'
2.union、in、or都能够命中索引,建议使用in;
3.用or分割开的条件,如果or前的条件中列有索引,而后面的列中没有索引,那么涉及到的索引都不会被用到;
4.范围条件查询可以命中索引。范围条件有:<、<=、>、>=、between等。
5.where 后 字段执行计算,不会中索引
6.B-tree 索引 is null 不会走, is not null 会走
7.负向条件查询不能使用索引。
8.联合索引遵循最左前缀匹配规则,联合索引的最左列开始向右匹配,直到遇到匹配终止条件。例如联合索引(col1, col2, col3), where条件为col1=a AND col2=b可命中该联合索引的(col1,col2)前缀部分, where条件为col2=b AND col3=c不符合最左前缀匹配,不能命中该联合索引。
9.联合索引时,匹配终止条件为范围操作符(如>, <, between, like等)或函数等不能应用索引的情况。例如联合索引(col1, col2, col3), where条件为col1=a AND col2>1 AND col3=c, 在col2列上为范围查询,匹配即终止,只会匹配到col1,不能匹配到(col1, col2, col3).
注意:
1.区分度不大的字段上不宜建立索引。
2.业务上具有唯一特性的字段,即使是多个字段的组合,也必须建成唯一索引。
3.多表关联时,要保证关联字段上一定有索引。
4.频繁更新的字段不要建索引,每次更新都会重建索引,会消耗数据库性能。