一、什么是索引
如果你对索引的认识还停留在目录这一层面上是还不够的,索引是什么呢,索引是一种存储数据的数据结构,在mysql中 Innodb引擎使用 B + tree 作为索引的数据结构。
二、为什么是 B + tree
关键字 = 路数 - 1 , 这里有3路(箭头代表),关键字存在磁盘块里面的键值一般是主键关键字等;
数据data只存放在最后一层叶子节点中,Innodb 设置的每个磁盘块的大小为16kb,一个int = 4 byte ,算上存储孩子节点的4个字节
所以一个磁盘块能够存放的关键字个数 = 16 * 1024byte / (4 + 4) = 2048 , 推算出这颗树的路数 = 2048 + 1,
叶子节点个数 = 2048 * 2049 * 2049 约等于 2 * (2的10次方 * 2的10次方 * 2的10次方) = 2 * 2的30次方 1 073 741 824 约等于10亿,所以我们 B + tree 一般也就三层,这样就大大减少了IO的操作次数,磁盘块存储关键字的个数和我们设置索引的大小非常重要,所以我们在给主键设置大小的时候,长度要严格定义,索引列的长度能少就少。
三、索引类型
a)主键索引
b)唯一索引
c)联合索引
1. 经常用的列优先
2. 离散性高的列优先(离散度原则)
3. 宽度小的列优先 (最少空间原则)
d) 覆盖索引
覆盖索引是 [select] 的数据列只用从索引中就能够取得,不必读取数据行,换句话说查询列要被所建的索引覆盖。
Select * from table 是一种不推荐的写法, 如果我们查询的列命中了联合索引,意思就是说查询出来的列可以用覆盖索引代替,减少IO的次数。
三、全表扫描
在无索引的条件下,mysql 从磁盘中一次读取多个数据块,直至将整张表读到内存,但是在有索引的情况下就不同了,mysql会访问只需要的索引块和数据块。
myIsam 引擎不支持事务。
Innodb 为mysql 的默认存储引擎。