项目学习之MySQL 索引优化讨论|青训营笔记

160 阅读3分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第4篇笔记

一、在 MySQL 中索引有什么用

索引是快速搜索的关键。MySQL 索引的建立对于 MySQL 的高效运行是很重要的。对于少量的数据,没有合适的索引影响不是很大,但是,当随着数据量的增加,性能会急剧下降。

二、项目中创建索引来提高查询效率的思路

首先,基于我目前写的项目,用户表的设计是这样的,有一个自增主键字段是 id,但是用户的唯一标识是用雪花 id 生成的,字段是 userid。然后因为雪花 id 是全局唯一的,所以刚开始数据库表没有建立 userid 的唯一索引(雪花 id 在业务逻辑上限制了插入的唯一性)。但是这样有一个问题,就是当查找用户信息的时候使用的查询语句类似于select * from user where userid = ?,在这里,userid 这一列是查询条件,由于没建立索引,所以这个查询是全表扫描,因此我选择在 userid 这个字段加上唯一索引(ALTER TABLE user ADD UNIQUE userid),提高查询效率。

三、Mysql 索引类型

这里我总结了一些常用的索引类型

  • 主键索引 PRIMARY KEY
  • 唯一索引 UNIQUE
  • 普通索引 INDEX
  • 组合索引 INDEX(设置索引名相同)
  • 全文索引 FULLTEXT 什么是全文索引?

全文索引(也称全文检索)是目前搜索引擎使用的一种关键技术。它能够利用分词技术等多种算法智能分析出文本文字中关键字词的频率及重要性,然后按照一定的算法规则智能地筛选出我们想要的搜索结果。

四、索引的性质

首先 MySQL 中普遍使用 B+Tree 做索引,但在实现上又根据聚簇索引和非聚簇索引而不同。 所以 MySQL 的索引有如下的性质

  • 索引字段设计要尽量的小(数据页大小固定,数据项的字段越小,每个数据页可以存的数据就越多,树高越低)
  • 索引有最左匹配特性 当 B+ 树的数据项是复合的数据结构,比如(id,name,age)的时候,B+ 树是按照从左到右的顺序来建立搜索树的,比如当(001,小明,18)这样的数据来检索的时候,B+ 树会优先比较 id 来确定下一步的所搜方向,如果 id 相同再依次比较 name 和 age,最后得到检索的数据;但当(小明,18)这样的没有 id 的数据来的时候,B+ 树就不知道下一步该查哪个节点,因为建立搜索树的时候 id 就是第一个比较因子,必须要先根据 id 来搜索才能知道下一步去哪里查询。比如当(001,18)这样的数据来检索时,B+ 树可以用 id 来指定搜索方向,但下一个字段 name 的缺失,所以只能把 id 等于 001 的数据都找到,然后再匹配 age 是 18 的数据了。所以最左匹配特性是非常重要的性质。

五、总结

在 MySQL 中,当数据量大的时候,要给经常使用的查询条件建立索引,以便提高查询效率,但建立多列组合索引的时候,要注意 MySQL 的最左匹配原则,如果你的查询条件不符合最左匹配原则,你这个索引就是无效的索引,这个查询就变成了全表查询,效率十分低下。