[学习打卡]09MySql索引的优化
单表索引优化
示例
示例1:
索引:
效果:
示例二:
索引:
效果:
示例三:
索引:
效果:
更改了where之后的条件顺序之后:
索引依旧生效,效果如下:
还是实例三的索引,删除一个条件之后
效果:
只命中了一个字段,只命中了age而没有命中name
同样:替换一个之后
效果:
没有命中索引。
原因:
age 之后 应该是 deptid 但是 没有写 所以有了第一次的那个 只命中一个索引的 “5”
而下一次实验 直接把age换成了 deptid 这就导致了 没有命中第一层索引的age 索引的入口都没有了 所以就没有能够调用索引进行搜索。
这就是 最佳左前缀法则:索引从最左前列开始并且不跳过索引中的列进行依次命中!
示例四:
没有建立索引之前查询用相同的时间,但是在用上索引之后 ,第一条语句有明显的变快了。第二条语句,没有用上索引:原因是加函数之后,索引会失效。理论上=链接比like模糊查询的效率更快的,但是加了left()函数截取字段 导致索引失效!
示例五:
创建索引之后 只命中了两个int型的索引,效果:
没有那么好的效果
原因是 where里面的deptid 有范围查询,范围查询后的索引会失效。所以要修改索引。
注意 把创建索引时的顺序放在最后就可以了,where 并不做要求,当然吧带有范围查询的子句放到最后会更直观。
示例六:
出现不等于的情况
添加 索引了,但是没有用上。
原因就是<> 不等于 索引会失效。
示例七:
IS NULL可以使用上索引
IS NOT NULL没有使用索引。
示例八:
相比较与示例四: %abc% 这样会失效,原因是 不能确定首字母,无法命中用首字母拍好的b+树。索引会失效
总结:
关联、子查询索引:
left join:
class是驱动表,book在left join后面 是被驱动表。
inner join:
inner join 书写表的顺序 没有区别的 ,这就导致MySql可以进行自动选择,把带索引的 当做被驱动表,没有索引的 当做驱动
表。
总结建议:
子查询:
排序优化:
order by
示例一:
对与查询结果进行排序了,但是创建索引了之后 还是没有效果
进行分页之后 索引有了效果
排序用上索引的条件就是 要有必要的过滤!分页也是一种过滤.
示例二:
这种情况用上索引了 原因是 where 里的age用上索引了
order by 之后的顺序 必须要和索引的顺序一致,否则索引失效,他不同于where 后面的顺序,mysql可以自动排序,原因是更改顺序不会影响数据的结果,order则不懂,他的先后顺序会影响结果的。
还有就是 要么都是升序要么都是降序的时候 按照索引顺序书写 是没有问题的
但是如果一个是升序,一个是降序,则索引就不会使用!
Group By分组
和order by 几乎一致 只是不需要遵循限制条件。