索引就像树的目录,是为了更快的找到所要找的内容(数据)。MySQL中,索引是在存储引擎层实现的,不同的存储引擎有不同的索引模型,如innodb是采用的是B+树的索引模型,本篇主要以innodb存储引擎的索引模型来讲解索引知识。
1.innodb存储引擎的索引模型
在innodb中,表都是根据主键顺序以索引的形式存放的,这种存储方式的表称为索引组织表,而innodb的索引模型是B+树,所以数据都存储在B+树上。
每一个索引在innodb里面都对应一颗B+树,根据树的叶子节点的不同,索引分为主键索引(存的是整行数据)和非主键索引(叶子节点为主键),其中主键索引又称为聚簇索引,非主键索引称为二级索引。
主键的长度越小,普通索引的叶子节点所占的空间就越少,从这个角度来说用自增主键对索引维护的代价要小很多。那在什么业务场景下可以用业务字段做索引呢,如下场景:
a. 只有一个索引 ;b. 这个索引必须是唯一索引。这样就不用考虑其他索引的叶子节点的大小问题。
2. 覆盖索引
mysql> create table T ( ID int primary key, k int NOT NULL DEFAULT 0, s varchar(16) NOT NULL DEFAULT '', index k(k)) engine=InnoDB; insert into T values(100,1, 'aa'),(200,2,'bb'),(300,3,'cc'),(500,5,'ee'),(600,6,'ff'),(700,7,'gg');
当执行查询语句 select * from T where k between (3,5);时mysql会先在 k 索引树上查找满足3 到 5 范围内叶子节点(即主键ID 100、500),然后到主键索引树上查找满足条件的行,这个查找过程称为回表。
如果执行查询语句 select ID from T where k between (3,5);时,则在 k 索引树上即可查到满足条件的ID的值,而避免了回表,这种通过索引查询条件的结果即可“覆盖”查询需求称为覆盖索引,可见覆盖索引也是优化sql的一种很好的手段。
3.最左前缀原则
索引的维护也是需要成本的,因为有最左前缀原则,当建立一个联合索引(name,age)时,一般就不用单独建立name索引了。