比如下面这条sql语句执行器流程是这样的:
select* fromt_test3 wherename= 'a';
- 调用InnoDB引擎接口获取这个表的第一行 , 判断name的值是不是a , 如果不是则跳过 , 如果是则将这行存在结果集中 。
- 调用引擎接口获取下一行 , 重复相应的判断逻辑 , 直到取到最后一行数据
- 执行器将遍历过程中所有满足条件的行组成的记录集作为结果集返回给客户端 。
当数据量比较小的时候 , 会使用all类型进行查询对应数据 , 当数据量比较大时 , 查询数据量增大时 , 会采用range类型 , 并使用对应列的索引进行查询 。这便涉及到了数据库查询索引的离散度 。离散度 , 外文 Measures of Dispersion , 是指通过随机地观测变量各个取值之间的差异程度 , 用来衡量风险大小的指标 。离散度在不超过全表的10%-15%的前提下索引才可以显示索引所具有的价值 。当离散度超过该值的情况下全表扫描可能反倒比索引扫描更有效 。我们所追求的目标就是创建全表扫描所无法比拟的有效索引 。比如当我们对一张学生表信息中对性别添加索引 , 性别只有两种值 , 会产生大量的重复 , 离散度较小 , 使用性别索引会增加查询开销 , 使得在使用性别的索引查询时可能比没有性别索引的查询更慢 。
基于数据库索引的离散度 , 可以参考以下两个建议进行创建索引:
- 在允许的情况下 , 对具有较好离散度的列单独创建索引 , 这样可以提高该索引的使用弹性;
- 对于离散度较差的列 , 通过对多列进行合理的组合来创建组合索引 , 虽然这样做在很大程度上降低了各个列的使用弹性 , 但是却可以发挥多个列的综合效应 。
【面对 MySQL 查询索引失效,程序员的六大优化技巧!】根据这些情况 , 我们必须选择对索引有正确的理解 , 并不是创建索引就能增加查询速度 。根据使用索引的特性 , 对创建索引的一些技巧总结如下:
- 首先数据量小的表不需要建立索引 , 因为数据量小的表即使建立索引也不会有大的用处 , 还会增加额外的索引开销。
- 不经常引用的列不要建立索引 , 因为不常用 , 即使建立了索引也没有多大意义。
- 经常频繁更新的列不要建立索引 , 因为肯定会影响插入或更新的效率。
- 尽量避免在 where 子句中使用 ! = 或者 <> 操作符 , 查询引用会放弃索引而进行全表扫描 。
推荐阅读
- 30种SQL语句优化
- 行程查询 行程卡可以多次查询吗
- 周公解梦大全查询梦见退潮 做梦梦见退潮
- 梦见蜜蜂叮是什么预兆 周公解梦大全查询梦见被蜂子叮
- 快速查询余票信息 飞机票余票查询
- 大牛总结的MySQL锁优化,写得太好了
- MySQL好在哪?怎么用?终于有人讲明白了
- 查看MySQL所有数据库列表
- 10种常见的MySQL错误,你可中招?
- 修改重置MYSQL5.7得ROOT登录密码