今天我们从最基础的方面来聊聊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的内容。
喜欢就一键三连吧,更多资料可以私信回复获取!