-
聚簇索引:数据和文件放在一起:
InnoDB
.frm
:存放的是表结构,
.ibd
:存放的是数据文件和索引文件。 -
非聚簇索引:数据和索引单独一个文件:
MyISAM
.frm
:存放的是表结构,
.MYI
:存放索引数据
.MYD
:存放实际数据 -
索引结构:
B+Tree是在BTree的基础之上做的一种优化,变化如下:
1、B+Tree每个节点可以包含更多的节点,这个做的原因有两个,第一个原因是为了降低树的高度,第二个原因是将数据范围变为多个区间,区间越多,数据检索越快
2、非叶子节点存储key,叶子节点存储key和数据
3、叶子节点两两指针相互连接(符合磁盘的预读特性),顺序查询性能更高
- InnoDB是通过B+Tree结构对主键创建索引,然后叶子节点中存储记录,如果没有主键,那么会选择唯一键,如果没有唯一键,那么会生成一个6位的row_id来作为主键
- MyISAM叶节点存的是地址,根据地址去数据文件里找到对应记录。
- 如果创建索引的键是其他字段,那么在叶子节点中存储的是该记录的主键,然后再通过主键索引找到对应的记录,叫做回表
1.主键一般设为自增,新增数据都会在索引文件末尾添加,利于索引维护,若不是自增,在中间插入会导致索引页的页分裂和合并,增加开销。
2.覆盖索引,select id from tbl_t where name = 'mm'
,这里对name列建立了索引,id是主键,这样的话就可以通过一次name的索引拿到id了,不用再去id的索引树里找,不需要用到回表。
3.组合索引,(最左匹配原则)
比如有张表,有id,name,age,address, 我们在name,age创建了组合索引,则当
select * from tbl where name=' ' and age=' ';
select * from tbl where name=' ' ;
上面会用到索引。
但是直接
select * from tbl where age=' ';
这样不会用到索引。
4.索引下推,select * from tbl where name=' ' and age = 10;
这里原先name
建有索引,本来要用回表,先根据name
索引找到->对应id
,再去id
索引去筛选age=10
.
现在可以用索引下推,提前查找name
的时候筛选age
,在回表之前做了数据筛选,提高执行效率
网友评论