Mysql 索引看这一篇就够了

本文介绍了数据库索引,它是加快查询的数据结构。探讨了索引的数据结构,如二叉平衡搜索树、B树和B+树,指出MySQL的innodb采用B+树作索引以减少I/O次数。还提到覆盖索引可提高查询效率,以及索引的最左匹配原则对SQL查询效率的影响。

索引是什么

索引是一种可以加快查询的数据结构。例如我们在读书,查新华字典的时候,我们不会一页一页的翻去找到我们要查找的内容。我们是在书的前几页的目录中首先找到我们要查找的内容在书中的第几页,然后直接翻到那一页就找到了我们的目标内容。

数据库中的索引

那么类似上面的例子,在数据库中面对千千万万的磁盘数据,当我们查找的时候也不可能一个一个磁盘块去查找数据,这样的效率是很低的。同样,伟大的前辈们创造了数据库的索引,这样我们在查找数据的时候,先在索引中找到我们的目标在磁盘上的位置,然后去查找,这样极大的节约了查找时间。

索引是怎样的一种数据结构

既然索引是为了提高查询效率,现如今最快的查找算法莫过于时间复杂度为O(logN)二分查找算法了。二分查找随快,但是要求元素必须是有序的。数据库中的元素是不断的累加的上去的,如果要求有序,则每次插入数据就需要给元素排序。如果索引存储在数组的数据结构上,那么数据的插入和删除将是一个灾难。那么有没有一种数据结构是擅长插入和删除操作的呢?没错,就是链表,但是链表上面是做不了二分查找的(此处不用解释吧?不懂的小伙伴自行Google)。那么增养才能做到,使用二分查找,又善于增/删操作呢,如此重任非二叉平衡搜索树莫属了。

二叉平衡搜索树

假如我们使用二叉平衡搜索树作为索引的数据结构,搜索一个目标数据的时间复杂度相较于O(n)的算法,已经提升到了O(logN)了。但这还不够,因为索引是存储在磁盘上的,I/O操作是非常耗时间的,一次I/O操作的时间CPU可以执行几十万次指令了,是否还可以继续减少I/O的次数呢?B树。

B 树

B 树二叉平衡树的变体,它是多路搜索树,通俗来讲就是叉路变多了,由于叉树变多了,则树的层数就会减少,层数减少则意味着I/O次数的减少。B树将数据存储在节点中,搜索时将节点中的数据取出然后在内存中使用二分查找,找到对应的数据是很快的。哪还有没有可能继续减少I/O次数呢(树的层次减少一层,即可减少一次I/O的次数),减少I/O,让CPU计算来加快整体的速度。B+树。

B+树

操作系统I/O操作的单位为页,根据操作系统的不同,页存储的数据大小不同。如果每个页里面存入更多的数据,意味着I/O的次数减少。B+树将所有数据元素存储在叶子节点上,则非叶子节点上就可以存储更多的指针数据,这样就可以分出更多的叉路,同时意味着树结构的层数更少,则I/O的次数变得更少,整体搜索速度得到了更大的提升。因此,mysql 的 innodb 采用了 B+ 树来作为索引。

覆盖索引

Mysql 的索引采用B+树作为数据结构,数据库中数据全部都存储在了叶子节点上,索引字段的值会存储在树的节点上,因此就会有覆盖索引的说法。假如我们要查找的字段就包含在索引中,则查询的效率会更高,因为它避免了去叶子节点查找的步骤。

索引的最左匹配原则

最左匹配原则说的是搜索的时候,该 SQL 语句是否可以利用到索引来提升效率。假设我们在数据库中建立了联合索引(name,age,addres),那么我们在写 SQL 语句的时候,where 条件中 name,age,address 同时他们所在的表达式不是 全模糊/左模糊查询,则该查询可以使用索引,同时不论他们在 SQL 条件中的顺序,因为数据库会将他们优化成合适的顺序。但是假如你的条件中只有name 和 addres,那么只有 name 可以使用索引,address 是使用不到的。

欢迎关注,一起来学习
在这里插入图片描述

MySQL中,索引优化是提升数据库查询性能的重要手段。为了实现高效的查询操作,需要从多个方面对索引进行设计和调整。 ### 索引的类型与选择 MySQL支持多种类型的索引,包括B-Tree索引、哈希索引、全文索引以及空间索引等。其中,B-Tree索引是最常用的一种,适用于范围查询和精确匹配查询[^1]。选择合适的索引类型对于特定的应用场景至关重要。例如,对于频繁的范围查询,B-Tree索引更为合适;而对于等值查询,则可以考虑使用哈希索引。 ### 创建高效索引的原则 创建索引时,应遵循以下原则以确保其效率: - **避免冗余索引**:不必要的索引会增加写入开销并占用额外存储空间。 - **前缀索引**:当字段长度较长时(如VARCHAR(255)),可仅对字段的一部分建立索引,这样既能减少索引大小,又能保持较高的查询效率。 - **组合索引**:合理利用多列索引,需要注意最左前缀原则,即查询条件中必须包含组合索引的第一个字段才能有效利用该索引[^3]。 ### 查询语句的优化 除了索引的设计之外,SQL查询语句本身的优化也是不可忽视的部分。优化查询语句的方法包括: - 使用EXPLAIN分析查询计划,检查是否有效地利用了现有索引。 - 减少SELECT语句中的列数,尤其是避免使用SELECT *。 - 对于大型表,尽量避免使用全表扫描,而是通过适当的索引来加速数据访问。 ### 维护索引 随着时间推移,数据库中的数据会发生变化,因此定期维护索引是非常必要的。这包括重建或重组索引以消除碎片化,以及根据实际的数据分布情况调整索引策略[^4]。 ### 示例代码 这里提供一个简单的例子,展示如何为一个用户表创建一个复合索引,并通过EXPLAIN命令查看查询是否使用了这个索引: ```sql -- 假设有一个名为users的表,包含id, name, email字段 CREATE INDEX idx_name_email ON users(name, email); -- 创建组合索引 -- 使用EXPLAIN来分析查询 EXPLAIN SELECT * FROM users WHERE name = 'John Doe' AND email = 'john@example.com'; ``` 执行上述`EXPLAIN`命令后,如果输出显示`key`列包含了`idx_name_email`,则表示查询成功地利用到了所创建的组合索引。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值