[学习打卡]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 几乎一致 只是不需要遵循限制条件。

经验分享 程序员 微信小程序 职场和发展