二级查询 MySQL五种索引类型sql执行顺序哪些适合建索引失效
MySQL五种索引类型 #
sql执行次序 #
(根据sql执行顺序来优化,可以把关联表判断条件放到on后面)
from
on
join
where
group by
having
select
distinct
union
order by
limit
#
#
一、哪些数组适宜建索引 #
#
范围查询索引失效,只针对二级索引(不仅字段,其他索引都是二级索引) #
(1)、如果走二级索引查询,步骤就是:二级索引–>字段索引–>数据,这就是回表查询(mysql索引中关联的字段,而不是数据,所以二级索引查询会有一个回表的操作)。 #
(2)、硬盘随机I/O的性能远高于次序I/O。
#
1、范围查询失效问题
#
注意二级查询,舍弃索引走全表查询须要满足以下几点:
#
1、二级索引 #
2、范围查询 #
3、查询数目超过了总数据的某个比率 #
4、并且查询数组不止id和索引还包含了其他数组(前面数组不仅仅为id和where前端索引数组)
建议索引*from表名useindex(索引名)where…
#
强制索引*from表名forceindex(索引名)where…
#
忽视索引*from表名index(索引名)where…
#
2、最左原则3、函数造成索引失效4、字段类型不一致索引失效5、运算符造成索引失效6、or造成索引失效 #
例:(和是索引,不是索引数组) #
7、模糊查询造成索引失效8、IN、NOTIN、、NOT造成索引失效
#
注意:
只检测存在性,出现多个一样的他只匹配一次
#
in前面出现多个一样的他是会每位匹配一次
所以,可以的话尽量用
#
网上说的大表套小表用in,小表套大表用,由于前面会关联查询多次,经验证不存在这些问题情况,从下边执行计划中可以看出是先执行1fromcWHERE=''由于这个sql查询的数据量恰好是1,之后在结果集的临时表中去获取最终结果。这些情况用in或是都一样疗效,区别无非是我前面说的相同数据匹配一次或多次区别! #
9、ISNULL,ISNOTNULL索引失效问题 #
10、子查询造成索引失效
子查询有三种形式:
1、跟在前面二级查询,会很慢(不建议) #
2、跟在join前面,会创建临时表
3、跟在where和on前面 #
当WHERE旁边跟子查询,
11、sql优化方案
可以按照以上造成索引失效、以及sql执行次序来针对sql进行优化
#
三、总结 #
索引失效可以从两个方面总结:
破坏了索引结构mysql优化器选择不走索引
破坏了索引结构:like前模糊,索引运算(加减乘除),对索引使用函数,组合索引非最左原则等。
mysql优化器选择不走索引:当查询数据量达到总表数据一定比率的时侯,优化器会感觉走索引效率不如全表查询,因而会舍弃走索引。 #