前言
mysql做为开发人员最常用的关系型数据库,所以掌握mysql对于开发人员来说是至关重要的,平时我们用到mysql最多的就是数据的插入、更新和查询,数据的插入和更新如果不是大批量的数据迁移一般都不会存在性能问题,但是查询就不一样了,随着数据库里数据量的增加,查询的就会慢慢的出现性能问题,这个时候我们就会想到加数据索引。
mysql索引类型和索引方法
一、索引类型
- 主键索引:一张表只能有一个、原因是:聚簇索引的顺序就是数据的物理存储顺序,而对非聚簇索引的解释是:索引顺序与数据物理排列顺序无关
- 唯一索引:插入的数据不允许重复,相当于一个唯一约束,对于查询性能和普通索引是一样的(但是对于插入性能会有一定影响,如果不是有特别的需求建议都建普通索引)
- 普通索引:插入的数据允许重复
- 全文索引:5.6之前只有myisam支持,5.6后myisam和innodb都支持,有字段的数据类型为 char、varchar、text 及其系列才可以建全文索引
二、索引方法
- BTREE:myisam+innodb 默认索引方法,支持范围查询
(1)聚簇索引:主键索引,如果没有定义主键索引,mysql会选择一个不重复的数值列当作主键索引,如果不满足mysql会生成一个隐藏的递增数字列并设置该列为主键索引,聚簇索引的叶子节点存的是整行数据。所以查询的时候尽量用到主键索引。
(2)非聚簇索引:一张表可以有多个非主键索引,非聚簇索引的叶子节点存的是主键索引和自己的索引数据,当使用非聚簇索引的时候,先是同过非聚簇索引拿到主键索引再用主键索引去查数据,这个过程叫做回表。 - HASH索引:只支持"=",“IN"和”<=>"查询,不支持范围查询,但是我们日常开发中多数都会支持范围查询,而且使用hash索引可能会有hash冲突导致查询性能骤降,所以我们平时也没怎么用
索引建议原则
- 选择唯一性索引
- 为经常需要排序、分组和联合操作的字段建立索引
- 为常作为查询条件的字段建立索引
- 限制索引的数目
- 尽量使用数据量少的索引
- 尽量使用前缀来索引
- 删除不再使用或者很少使用的索引
索引使用技巧
1.最左匹配
(1)最左前缀匹配原则,非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。
(2)=和in可以乱序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序,mysql的查询优化器会帮你优化成索引可以识别的形式
2.大表索引的维护
最好的是在表的设计之初就考虑好索引的建立,是在原索引上做修改,尽量不要新增索引
索引的优缺点
优点
1、索引能够提高数据检索的效率,降低数据库的IO成本。
2、通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性,创建唯一索引
3、在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间
4、加速两个表之间的连接,一般是在外键上创建索引
缺点
1、需要占用物理空间,建立的索引越多需要的空间越大
2、创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加
参考文献
- https://blog.csdn.net/qq_27607965/article/details/79925288
- https://tech.meituan.com/2014/06/30/mysql-index.html
- https://www.cnblogs.com/jiawen010/p/11805241.html
- https://draveness.me/whys-the-design-mysql-b-plus-tree/