【转】同一个SQL查询语句,为什么使用到的索引不同?
2017-08-18 15:46
791 查看
问:
同一个SQL查询语句,只是修改where条件中的一个值,为什么使用到的索引情况也会不同?谢谢!
1) explain执行结果,如下图:
2) 表中的数据如下图:
3) 表结构如下图:
4) 创建的索引如下图:
答:
前提:
1.mysql用中索引是btree索引,也就是说索引是平衡二叉树结构
2.你用的语句是select *
以下为分析
统计信息已经告诉你了
在条件是20150323时
预估行数是4
在条件是20150326时
预估行数是1
那么,我们知道,这个索引的Btree的查找数据为1条时,最多2次就可以定位到数据,由于你是select *,所以需要取得主键后去数据页取*的数据,这个也是一个二叉树查找,最多需要2次操作(针对你的表最多也就是2次查找了),也就是说在取一条记录时,查找次数是大概是2+2=4次
在预估4行的情况下,mysql会判断为使用索引的情况下需要4*4=16次查找操作,但是这时候扫描表的话(你的表很小,肯定所有数据在一个数据页上)只需要1个扫描就完成了,但是由于按主键扫描时候不是按code排序,所以会有sort操作
mysql的优化器是基于cost的,会选择消耗小的计划
所以有了你给出的查询计划
如果你把select *改成select create_date,这个查询就会使用索引了,但是10有89也是个扫描操作,实在是懒的测试了……
from:https://www.zhihu.com/question/28997400
同一个SQL查询语句,只是修改where条件中的一个值,为什么使用到的索引情况也会不同?谢谢!
1) explain执行结果,如下图:
2) 表中的数据如下图:
3) 表结构如下图:
4) 创建的索引如下图:
答:
前提:
1.mysql用中索引是btree索引,也就是说索引是平衡二叉树结构
2.你用的语句是select *
以下为分析
统计信息已经告诉你了
在条件是20150323时
预估行数是4
在条件是20150326时
预估行数是1
那么,我们知道,这个索引的Btree的查找数据为1条时,最多2次就可以定位到数据,由于你是select *,所以需要取得主键后去数据页取*的数据,这个也是一个二叉树查找,最多需要2次操作(针对你的表最多也就是2次查找了),也就是说在取一条记录时,查找次数是大概是2+2=4次
在预估4行的情况下,mysql会判断为使用索引的情况下需要4*4=16次查找操作,但是这时候扫描表的话(你的表很小,肯定所有数据在一个数据页上)只需要1个扫描就完成了,但是由于按主键扫描时候不是按code排序,所以会有sort操作
mysql的优化器是基于cost的,会选择消耗小的计划
所以有了你给出的查询计划
如果你把select *改成select create_date,这个查询就会使用索引了,但是10有89也是个扫描操作,实在是懒的测试了……
from:https://www.zhihu.com/question/28997400
相关文章推荐
- oracle数据库查询Sql语句是否使用索引及常见的索引失效的情况
- 比较不同查询语句使用索引的情况
- 比较不同查询语句使用索引的情况
- 使用SQL语句查询某表中所有的主键、唯一索引以及这些主键、索引所包含的字段(转)
- sql使用索引为什么查询速度变快很多
- MySQL查询不使用索引汇总 + 如何优化sql语句
- SQL SERVER 2000 的企业管理器与查询分析器对于同一SQL语句有两个不同查询结果!
- SQL查询语句使用详解
- SQL查询语句精华使用简要
- SQL查询语句精华使用简要 [转]
- SQL查询语句使用
- SQL查询语句精华使用简要
- SQL查询语句精华使用简要
- [转] SQL查询语句使用
- 数据库知识-SQL查询语句精华使用简要
- 数据库知识—SQL查询语句精华使用简要
- SQL查询语句使用
- SQL查询语句使用方法参考二
- 在SQL语句中使用索引提示提高SQL性能
- SQL查询语句精华使用简要