什么是索引?

索引在MySQL中也叫是⼀种“键”,是存储引擎⽤于快速找到记录的⼀种数据结构。索引对于良好的性能 非常关

键,尤其是当表中的数据量越来越⼤时,索引对于性能的影响愈发重要。 索引优化应该是对查询性能优化最有

效的⼿段了。索引能够轻易将查询性能提⾼好⼏个数量级。 索引相当于字典的⾳序表,如果要查某个字,如果

不使⽤⾳序表,则需要从⼏百⻚中去查。

索引优缺点

索引好处:加快了查询速度(select )

索引坏处:降低了增,删,改的速度(update/delete/insert),增大了表的文件大小(索引文件甚至可能比数据文件还大)

 

索引的数据结构

树状图是⼀种数据结构,它是由n(n>=1)个有限结点组成⼀个具有层次关系的集合。把它叫做“树”是因为它看

起来像⼀棵倒挂的树,也就是说它是根朝上,⽽叶朝下的。

 

它具有以下的特点:每个结点有零个或多个⼦结点;没有⽗结点的结点称为根结点;每⼀个非根结点有且只有

⼀个⽗结点;除了根结点外,每个⼦结点可以分为多个不相交的⼦


B+树


B+树是通过⼆叉查找树,再由平衡⼆叉树,B树演化⽽来

B+树性质


索引字段要尽量的⼩:通过上⾯的分析,我们知道IO次数取决于b+数的⾼度h,假设当前数据表的数据为

N,每个磁盘块的数据项的数量是m,则有h=㏒(m+1)N,当数据量N⼀定的情况下,m越⼤,h越⼩;⽽m = 磁

盘块的⼤⼩ / 数据项的⼤⼩,磁盘块的⼤⼩也就是⼀个数据⻚的⼤⼩,是固定的,如果数据项占的空间越⼩,

数据项的数量越多,树的⾼度越低。这就是为什么每个数据项,即索引字段要尽量的⼩,比如int占4字节,要

比bigint8字节少⼀半。这也是为什么b+树要求把真实的数据放到叶⼦节点⽽不是内层节点,⼀旦放到内层节

点,磁盘块的数据项会⼤幅度下降,导致树增⾼。当数据项等于1时将会退化成线性表。

 

2.索引的最左匹配特性:当b+树的数据项是复合的数据结构,比如(name,age,sex)的时候,b+数是按照从左到右的顺序来建立搜索

树的,比如当(张三,20,F)这样的数据来检索的时候,b+树会优先比较name来确定下⼀步的所搜⽅向,如果

name相同再依次比较age和sex,最后得到检索的数据;但当(20,F)这样的没有name的数据来的时候,b+树就

不知道下⼀步该查哪个节点,因为建立搜索树的时候name就是第⼀个比较因⼦,必须要先根据name来搜索才

能知道下⼀步去哪⾥查询。比如当(张三,F)这样的数据来检索时,b+树可以⽤name来指定搜索⽅向,但下⼀个

字段age的缺失,所以只能把名字等于张三的数据都找到,然后再匹配性别是F的数据了, 这个是非常重要的性

 

索引的使用原则

(1)不过度索引

(2)索引条件列(where后面最频繁的条件比较适宜索引)

(3)索引散列值,过于集中的值不要索引,例如:给性别"男","女"加索引,意义不大

创建索引命令

建表时创建索引:CREATE INDEX 索引名 ON 表名称 (column_name,[column_name...]); 最左边的列最关键

建表后创建索引