1,统计信息如果 失效或者过久也会导致不走索引
2,查询结果集 大于百分之 25以上的查询结果集,优化器有可能出现不选择走索引,走全表扫描。
3,隐式转换 使用char 类型插入数字,在查询数据的时候没有加引号,
select * from t1 where num=110,这种查询会走全表扫描,因为num字段类型是char 类型,不加引号,mysql会在底层将他转换为字符串在进行全表扫描
2.建立索引的原则(DBA运维规范)
说明
为了使索引的使用效率更高,在创建索引时,必须考虑在哪些字段上创建索引和创建什么类型的索引。
总结: 建索引原则
(1) 必须要有主键,最好数字自增列。 不建议业务字段创建主键
(2) 经常做为where条件列 order by group by join on, distinct 的条件(业务:产品功能+用
户行为)
(3) 联合索引最左原则。
(4) 列值长度较长的索引列,我们建议使用前缀索引.
(5) 降低索引条目,一方面不要创建没用索引,不常使用的索引清理 ##没用的索引和重复的索引要进行清理,会影响优化器的判断
sys.schema_unused_indexes
sys.schema_redundant_indexes
idx(a,b,c) a ab abc
(6) 索引维护要避开业务繁忙期,建议用pt-osc\gh-ost 大表建索引会慢很多
(7) 大量数据导入的时候,先把索引禁用。
3,不走索引的情况(开发规范)
(1)没有查询条件,或者查询条件没有建立索引
(2)查询的结果集,超过了总数行数25%,优化器觉得就没有必要走索引了。
(3)索引本身失效,统计信息不真实(过旧) analyze table t1;
(4)查询条件使用函数在索引列上,或者对索引列进行运算,运算包括(+,-,,/,! 等)
(5)隐式转换导致索引失效.这一点应当引起重视.也是开发中经常会犯的错误.
telnum char(11)
select from t1 where telnum = ‘110’; √
select * from t1 where telnum = 110; X
(6)<> ,not in 不走索引(辅助索引)
(7)单独的>,<,in 有可能走,也有可能不走,和结果集大小有关,尽量结合业务添加limit
(8)like “%_” 百分号在最前面不走
