像JPA、MyBatis-Plus这些简单的ORM关系映射框架的都有现成的方法调用,在我们的实际工作业务场景这些框架的基础功能根本满足不了,需要自己写一些复杂的SQL或者维护原系统中前人写下的复杂SQL。数据库语句的编写能力也是在未来工作中必不可少的一项技术硬实力,希望各位同学们能尽可能回归技术原始底层并对这个问题重视起来。
用书面的文字解释索引就是存储引擎用于快速找到记录的一种数据结构。索引对性能问题起着至关重要的作用,当我们的数据量越来越大时,索引的重要性也就越来越大了。
举一个简单的例子,书本上有目录吧,目录的索引部分,是不是一个章节对应着一个页码,那么通过页码我们就能轻松找到我们的目标内容位于书本的哪一页中。
索引可以包含一个或者多个列,如果索引包含多个列,那么此时索引的顺序野十分重要了,由于MYSQL的的索引有一个最左原则,索引的不正确使用不仅不会增加执行效率,甚至还会降低程序性能。
此时就涉及到一个高频提问来考察你的SQL基础,虽然你可能平常一直在接触,但是你一直忽略了这个问题:
什么情况下索引会失效?
一、如果条件中带or,如果条件中有or,即使其中有条件带索引也不会使用。
二、对于多列索引,不是使用的第一部分,则不会使用索引。
三、like查询以%开头。
四、如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引。
五、如果MYSQL估计使用全表扫描要比使用索引快,则不使用索引。
不同的存储引擎工作的方式是不一样的,也不是所有的存储引擎都支持所有类型的索引。及时多个存储引擎支持同一种类型的索引,他的底层实现可能也会不同。这里简单介绍一下常见的几种索引。
B-Tree就是所有的值都是按顺序存储的,并且每一个叶子页到根的距离相同。这里提一下MYSQL默认使用的是InnoDB存储引擎,而它所使用的索引是B+Tree。
B-Tree索引能够加快访问数据的速度,因为存储引擎不再需要进行全表扫描来获取需要的数据,而是从索引的根节点开始进行搜索,根节点中存放了指向子节点的指针,存储引擎再根据这些指针向下层查找。叶子节点比较特别,他们的指针指向的是被索引的数据,而不是其他的节点页(不同引擎的“指针”类型不同)。B-Tree对索引列是顺序组织存储的,所以适合查找范围数据,索引对多个值进行排序的依据是建表语句中索引 实列的顺序。
哈希索引是基于哈希表的实现,只有精确匹配索引所有列的查询才有效。对于每一行数据,存储引擎都会对所有的索引计算一个哈希码,哈希码是一个较小的值,并且不同键值的行计算出来的哈希码野不一样。哈希索引将所有的哈希码存储在索引中,同时在哈希表中保存指向每个数据行的指针。Memory引擎显式支持哈希索引,哈希索引是Memory引擎表的默认索引。这里需要注意一下的就是哈希碰撞问题。
总的来说,索引有如下三个优点:
1、索引大大地减少了服务器需要扫描的数据量。
2、索引可以帮助服务器避免排序和临时表。
3、索引可以将随机I/O变为顺序I/O。
但是索引并不是最好的工具,只有当索引帮助存储引擎快速查找到记录带来的好处大于带来的额外工作时,索引才是有效的。而对于非常小的表,大部分情况下简单的全表扫描更高效。
下篇博客咱们继续聊…
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/qq_51250453/article/details/123777777
内容来源于网络,如有侵权,请联系作者删除!