数据结构论坛

首页 » 分类 » 分类 » 阿里p7经验分享这些Mysql索引底层
TUhjnbcbe - 2024/6/21 17:12:00
中科医院曝光 https://news.39.net/bjzkhbzy/180119/6010344.html

今天我们从最基础的方面来聊聊MySQL索引,我相信应该有不少小伙伴都掌握了基本的数据库操作,增(insert)删(delete)查(select)改(update)。如果学得更深入的话,对于数据库的复杂查询SQL语句也有所了解,索引的概念因此略知一二,因为我们平时做的项目相对较小,比如就简单的一个Web系统。

数据库中的数据也不多,所以会感觉索引是否使用的效果差别不大,最多就是在一个表中定义了主键(PrimaryKey)。但是对于大型在线系统来说,数据库中的数据量亿万级别以上,索引对数据库查询的效率就很重要了,这明显是关乎用户体验的事情。所以,来认识一下MySQL索引,为之后遇到优化SQL查询打基础!

MySQL索引是什么?

它是存储引擎用来快速找到目标记录的一种数据结构。

它的工作原理就像,我们去看一本书,会先看目录(索引)部分,然后看到感兴趣的章节就根据页码翻看。在MySQL中,存储引擎(MylSAM、InnoDB等)使用索引,就会先在索引中找到对应值,然后根据匹配到的索引回表去找数据行。

MySQL有哪些索引,使用索引有什么优势呢?

索引类型:MySQL中的索引类型有很多,比如B+树索引、哈希索引、聚簇索引、覆盖索引,这几个比较常见而且使用较多的,还有空间数据索引、全文索引等。

索引的优点:索引可以让存储引擎快速定位到表中的指定位置,当然还有其他索引的功能。简单概况有这几个优点:1.大幅度减少服务器需要扫描的数据量。2.可以帮助服务器避免排序和临时表。3.将随机IO编成顺序IO。

B+Tree索引

B+Tree数据结构:最常见的B+树索引,按照顺序存储数据,在MySQL中可以用作orderby和groupby的操作实现。B+Tree的数据结构大家应该有所了解,B+Tree中,非叶子结点结构:

所有叶子节点(存放数据)之间是一种链式结构。

高性能MySQL书中给出,B+树存储数据的结构如图:

B+Tree索引特点:B+树适用于全键值、键值范围和键前缀查找(最左前缀)。特点:叶子到根结点距离相等,索引树是有序的。限制:

实验案例

举个例子,现在有一张表,各个字段如下:

增加几条记录:

索引包括了id、username、password三个列,存储在B+树结构中,会先按照三个字段依次进行排序,我们尝试查询,并查看执行计划。

根据前面查询是否走索引的特点,可以看到如果从左到右是会使用索引的。接下来测试无法使用索引的情况

哈希索引

哈希索引数据结构::基于哈希表的数据结构实现的,需要精确匹配索引所有列的查询才有效,存储引擎会对每一行数据的每一列计算一个哈希码。

解决哈希冲突:如果多个列的哈希值相同,索引会以链表的方式存放多个记录指针到同一个哈希条目。索引只需存储对应的哈希值,其结构十分紧凑,查找速度快。

实验测试:创建测试哈希索引的表,在name字段加上哈希索引。

也可以自定义哈希索引,下面我们使用CRC32作为哈希函数,创建伪哈希索引,进行一个简单的试验测试:创建触发器,当有数据插入或者更新时,自动计算哈希码存放到crc字段:

首先需要将分隔符定义为其他符号,这样才能在创建触发器时使用分号。

插入记录:

可以发现触发器维护了每一行的哈希值。

更新记录:

id为2的记录哈希码也会重新计算。

哈希索引的特点

五、聚簇索引

:实际是一种数据存储方式。聚簇:表示数据行和相邻的键值紧凑地存储在一起。InnoDB的聚簇索引是在同一结构中保存了B-Tree索引和数据行。一个表只能有一个聚簇索引。聚簇索引优点

缺点

覆盖索引

:如果一个索引包含(覆盖)所有需要查询的字段的值,这个索引称为覆盖索引。Mysql只能使用B-Tree做覆盖索引。索引可以用来提高查询效率,那如果能够直接通过索引获取数据,就不用回表查询,更加高效。因此覆盖索引就提供了这样的性能。覆盖索引的好处:

发现索引的知识点真的很多,而且理解难度不断增加,如果你能够坚持读到这里,说明你很认真,我相信至少掌握了2/3的内容。

喜欢就一键三连吧,更多资料可以私信回复获取!

1
查看完整版本: 阿里p7经验分享这些Mysql索引底层