你以为有了索引你就能提高查询效率,天真 |8月更文挑战

156 阅读2分钟

前言

  • 平时开发中mysql或者oracle这种关系型数据库应该是必备的。在这种关系型数据库中数据都是持久化的。如果想redis那样存储在内存中服务只要一重启就会丢失数据,在数据时代肯定是不能接受的。

索引前世今生

  • 那么在成千上万的数据中mysql又是如何快速定位到我们需要操作的数据的呢?这种情况就好比我们图书管理员是如何快速图书呢?
  • 在图书馆我们经常看到书是按照一定的分类进行摆放的。按类分布就是我们今天的主题【索引】。有了索引的存在我们就可以在千万数据中实现快速定位了。
  • 但是图书分类本身也是占用管理员精力的。首先在分类初期管理员就需要做大量的工作进行索引管理。其次就是分类的划分,如果分类划分不准确将会是灾难问题。得不偿失!!!

为什么我的索引感觉没啥作用

image-20210514141641551

  • 如上,是我临时创建的。里面五个字段id是主键。我们再看看索引有哪些

image-20210514141850672

  • 除了主键外还有一个由user_nickschool组成的联合索引。

image-20210514142118789

  • 上面两个sql一个执行了索引。一个居然没有走索引。本着索引最左匹配原则user_nick肯定是能走索引的。这就是典型的索引失效问题

image-20210514142619095

  • 像上述的索引树,如果我们执行第二条失效的sql的话,如果想通过索引查询所有包含a的内容这样我们只能全局遍历这颗索引树。然后在通过索引获取到行数据。
  • 但是如果我们直接全表扫描和全局扫描索引树相比就少了一个通过索引获取内容。这样反而快。所以这条sql没有走索引

索引失效情况

  • 查询中通过全模糊匹配索引字段会导致索引失效
  • 搜索条件中or查询的会导致索引失效
  • 索引类型要匹配,否则会造成类型转换也会导致索引失效 ; 比如userName='zxh' 可以走。userName=123 不走索引
  • 范围查询可能导致索引失效
  • 不等于查询会导致索引失效
  • 使用字段表达式也会导致索引失效
  • not in 会导致索引失效

总结

  • 索引固然重要但是使用不好的话,也同样产生慢查询
  • 理解索引内部存储原理才能理解为什么这些情况会导致索引失效。谨记一个原则索引也是数据。是数据的一个目录层级的数据