优化器选择索引的逻辑:
找到一个最优的执行方案,用最小的代价去执行语句。在数据库里,扫描行数是影响执行代价的因素之一,扫描行数越少,意味着访问磁盘的次数越少,消耗CPU资源越少。当然,是否生成临时表、是否排序等因素也会影响优化器选择索引。
索引选择异常和处理:
1.使用 force index 强行选择一个索引
如果索引改了名字,相因的语句需要修改。不同类型数据库迁移还可能会有语法不兼容
2.修改sql语句,引导mysql使用我们期望的索引 【但是要语句逻辑一致】
3.重建一个更合适的索引,或删掉误用的索引
前缀索引:
alter table A add index idx_mail(email(4)) ##比如 email的值为:xiaoming@qqq.com
执行顺序:
1.从索引树上找到满足索引值 xiao 的记录
2.到主键查处整行数据,判断取出的值与查询条件是否匹配 ##这里有一个回表的过程
3.查询下一条数据,继续判断,直到索引值不满足xiao的记录,跳出循环
优点:定义好长度,可以节省空间,减少额外增加的查询成本
缺点:在多个索引的查询条件中,覆盖索引会失效