索引
索引的使用
什么时候使用索引表的主关键字
- 表的字段唯一约束
- 直接条件查询的字段
- 查询中与其它表关联的字段
- 查询中排序的字段
- 查询中统计或分组统计的字段
什么情况下应不建或少建索引
- 表记录太少
- 经常插入、删除、修改的表
- 数据重复且分布平均的表字段
- 经常和主字段一块查询但主字段索引值比较多的表字段
复合索引
命中规则
- 需要加索引的字段,需要在where条件中
- 数据量少的字段不需要索引
- 如果where条件中是or条件,加索引不起作用
- 符合最左原则
- 最左原则:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。例如索引是key index (a,b,c). 可以支持a | a,b| a,b,c 3种组合进行查找,但不支持 b,c进行查找
- 在创建符合索引时,应该仔细考虑列的顺序,对索引中的所有列搜索或对钱几列进行搜索时,符合索引非常有用。
- 当一个表有多条索引可走时, Mysql 根据查询语句的成本来选择走哪条索引, 联合索引的话, 它往往计算的是第一个字段(最左边那个), 这样往往会走错索引
在mysql中使用索引注意
- 只要列中包含有null值将不会包含在索引中,复合索引只要有一列含有null值,那么这一列对于此复合索引就是无效的
- 对串列进行索引,如果可能应该指定一个前缀长度
- mysql查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作;尽量不要包含多个列的排序,如果需要最好给这些列创建复合索引。
- like “%aaa%” 不会使用索引而like “aaa%”可以使用索引。
- 不要在列上进行运算
- NOT IN和操作都不会使用索引将进行全表扫描。NOT IN可以NOT EXISTS代替
https://www.cnblogs.com/softidea/p/5977860.html