Mysql基础知识—索引
公司最近开始尝试进行改革,如何活跃团队气氛。开发就给我们说了一些算是科普类的数据库知识,下面参杂自己的理解,方便自己后续翻看。
1、什么是索引
索引在MySQL中也叫做“键”,是存储引擎用于快速找到记录的一种数据结构。(注:以下的说明主要针对的是B+树索引)
2、索引的用途
索引对于良好的性能非常关键,尤其是当表中的数据量越来越大时,索引对于性能的影响愈发重要。索引优化应该是对查询性能优化最有效的手段了。索引能够轻易将查询性能提高好几个数量级。索引相当于字典的音序表,如果要查某个字,如果不使用音序表,则需要从几百页中逐页去查。
3、索引的原理
a、二叉树
b、字典的索引理解(此处省略一万字,简单的来说就是不停的拆分,粒度越小越好)
4、索引的创建
a、索引不是越多越好
只从读的角度考虑,其实索引是越多越好的。综合考虑的话就不是这样了:
首先就是存储空间的问题,索引越多,占用的存储空间越大(一般一张数据库的表存储空间分开两块,一块是存储索引的,一块是存储数据的)。
其次是新增和修改数据的时候,如果索引字段有变更的话,对I/O的操作会造成几何倍的增加。
b、索引字段最好是数字
数字类索引占用的空间最小。其实还是和多叉树的数据分配有关,字符类的索引树层级不稳定。
c、索引要选择不经常变更的字段
见 4.a
d、索引建立在离散度大的字段上
离散度的树的分叉才能多,索引命中率才会高。(离散度我的理解是数据分布相对于整个数据集的比例,数据的分散程度越大,越有代表性)
e、索引的最左原则
这是索引中很重要的一个特性,即索引的匹配是从左到右的。比如一个联合索引由('name','sex','age')组成,如查询('女','24')这样的数据,数据库找不到最开始的name,那么这条SQL就不会用到索引。如果查询('青莲','23')这样的数据,数据库会先找到名字是“青莲”的数据,然后发现缺少B,就会把所有名字是青莲的数据找出来,然后再去匹配age=23的数据。
f、关于索引排序
这是随着公司业务发展而衍生出来的一个东西,我也是第一次知道索引这东西还能通过排序去进一步优化。例如A&B&C三个字段组成的联合索引,可以把A&B索引出来的数据,通过排序,然后在用C去检索。当然只针对查询的性能来说,和检索A&B&C是几乎一样,但是针对特殊业务场景,还是可以这样做的(例如在满足A&B索引的条件下,一个动态的id,每次只取前20条数据)
g、关于查询尽量只查用到的字段
我们一直听到的是select尽量别用星号(*),但其实这里消耗的性能并没有我们想象的那么多。
上面说过,表的存储空间分为两块(索引和数据),所以如果我们需要查询的数据在索引字段中就有了,那么就没必要再去数据那边跨区查找了,这部分的查询消耗资源就能大幅度节约。