本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看<活动链接>
前言
- 网络开发中离不开数据库的存在。现在的网站开发不再是以前的静态网页了数据存储在基于数据成长出来的大数据才是王道
问题描述
- 数据库离不开讨论的就是索引。索引的存在能够大大加快数据的查询。因此各大数据库也对自己的索引不断进行优化
- 我们系统开发初期设计数据库的时候会尽量考虑索引的设计,不能频繁使用索引
- 即便如此,我还是遇到了问题。在我的一个sql中明明我是按照索引的规则书写的但是这条sql还是很慢。确切的说他就是没有走索引
问题分析
- 如上,是我临时创建的。里面五个字段id是主键。我们再看看索引有哪些
- 除了主键外还有一个由
user_nick
和school
组成的联合索引。
- 上面两个sql一个执行了索引。一个居然没有走索引。本着索引最左匹配原则user_nick肯定是能走索引的。这就是典型的索引失效问题
- 像上述的索引树,如果我们执行第二条失效的sql的话,如果想通过索引查询所有包含a的内容这样我们只能全局遍历这颗索引树。然后在通过索引获取到行数据。
- 但是如果我们直接全表扫描和全局扫描索引树相比就少了一个通过索引获取内容。这样反而快。所以这条sql没有走索引
索引失效情况
- 查询中通过全模糊匹配索引字段会导致索引失效
- 搜索条件中or查询的会导致索引失效
- 索引类型要匹配,否则会造成类型转换也会导致索引失效 ; 比如userName='zxh' 可以走。userName=123 不走索引
- 范围查询可能导致索引失效
- 不等于查询会导致索引失效
- 使用字段表达式也会导致索引失效
- not in 会导致索引失效
总结
- 索引固然重要但是使用不好的话,也同样产生慢查询
- 理解索引内部存储原理才能理解为什么这些情况会导致索引失效。谨记一个原则索引也是数据。是数据的一个目录层级的数据
点赞、收藏、评论