1.常用索引模型。
1.1 hash表
哈希表结构适合于 等值查询场景。 链表结构,非有序。
1.2 有序数据
有序数组,在等值查询和范围查询场景中的性能都十分优秀。
有序数组索引查询只适合静态存储引擎。
缺点:更新数据的成本高。 为了保证有序
1.3 搜素树 Innodb的索引模型
二叉树:效率高,但是实际中绝大多数数据库都不会用,因为树高。索引不止要存储在内存中,还要写盘,从磁盘上读取一个数据快需要大约10ms的寻址时间。
多叉树:
在innodb中,表都是根据主键顺序以索引的形式存放,这种存储方式的表称为索引组织表。
innodb使用了B+树索引模型,所有数据都存在B+树中。
2. 索引
创建一个表:id为主键 k 上与索引
mysql> create table T(
id int primary key,
k int not null,
s varchar(100) NOT NULL DEFAULT ‘‘,
index (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‘);
-
主键索引和非主键索引:
-
1.主键索引的叶子节点存储的是整行数据。在innoDB中,主键索引是一种聚簇索引(clustered index)2.非主键索引的叶子节点存储的是主键键值。在innoDB中,非主键索引也成为二级索引(secondary index)3.主键索引 与 非主键索引 查询的区别:主键索引 查询的方式只需要 搜索id 这颗 B+树。普通索引 查询,先查询普通索引树,得到对应的主键id,再用id索引树搜索一次。这个过程我们称之为回表。4.索引的维护如果数据不是自增序列,可能再插入数据之后造成-页分裂-使原本放在一页的数据分到2个页中,整体空间利用率下降50%。
常用的索引
1.覆盖索引:
如果查询sql
select *from T where k between 3 and 5;
此时需要因为要去拿 T表的所有字段,所以需要回表。 有什么方法 优化呢,此时就可以引入覆盖索引。
select ID from T where k between 3 and 5;
此时我们只需要 获取对应的id,而id已经在k的索引树上了,所以不需要回表。
由于覆盖索引可以减少搜索树搜索次数,所以对sql的性能有显著的提高,故 覆盖索引是一种常见且重要的优化手段。
所以,我们常以联合索引的方式构建索引。
2. 最左前缀原则。
在一些不频繁 但是我们又不想做全表访问的查询。
B+树这种索引,我们经常利用 【最左前缀】,来定位记录。
不要定义索引的全部定义,只需要满足索引的前 N个字符,就可以利用索引加速检索。
因为联合索引支持 最左前缀,所以我们可以通过 调整 联合索引的顺序 减少索引树的创建,有利与提升 新增/更新 时的性能。
例如创建联合索引(a,b) 此时就不需要创建所以(a)
索引创建的第一原则:如果可以通过调整联合索引的顺序,而达到少创建索引的目的,那么这个顺序我们往往 优先使用。
3. 下推索引
在索引查询的便利过程中 例如查询:
select * from tuser where name like ‘王%‘ and age=18 and ismale=1;
此时想查询姓 王/十八岁/男性
Mysq5.6只能从age = 18 开始一个一个回表,找到主键索引上的数据,再做字段比较。
Mysql5.6之后引入了索引下推,可以再索引遍历的过程中,对索引包含的字段进行判断,直接过滤掉不满足的数据,减少回表次数。