美文网首页程序员
mysql索引相关知识

mysql索引相关知识

作者: 尉昌达 | 来源:发表于2020-07-01 22:52 被阅读0次
  • 聚簇索引:数据和文件放在一起:InnoDB
    .frm:存放的是表结构,
    .ibd:存放的是数据文件和索引文件。

  • 非聚簇索引:数据和索引单独一个文件:MyISAM
    .frm:存放的是表结构,
    .MYI:存放索引数据
    .MYD:存放实际数据

  • 索引结构

mysql索引数据结构--B+Tree

B+Tree是在BTree的基础之上做的一种优化,变化如下:

1、B+Tree每个节点可以包含更多的节点,这个做的原因有两个,第一个原因是为了降低树的高度,第二个原因是将数据范围变为多个区间,区间越多,数据检索越快
2、非叶子节点存储key,叶子节点存储key和数据
3、叶子节点两两指针相互连接(符合磁盘的预读特性),顺序查询性能更高

InnoDB
  • InnoDB是通过B+Tree结构对主键创建索引,然后叶子节点中存储记录,如果没有主键,那么会选择唯一键,如果没有唯一键,那么会生成一个6位的row_id来作为主键
MyISAM
  • 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,在回表之前做了数据筛选,提高执行效率

相关文章

网友评论

    本文标题:mysql索引相关知识

    本文链接:https://www.haomeiwen.com/subject/aknqqktx.html