mysql索引
||约 2 分钟 · 560 字|评论
请注意,本文编写于 1240 天前,最后修改于 145 天前,其中某些信息可能已经过时。
innodb存储引擎
mysql中除了innodb,还有比如myisam,memory等其他引擎,innodb最常用
索引的数据结构
使用索引带来的查询性能提升:
- 减少了磁盘io
- 支持创建不同的索引,针对不同的查询场景适配
B+树存储
以聚簇索引为例:
- B+树中叶子节点同时存储了
全部的行数据和主键id - 多个记录组成一个
page,page内记录间通过单向链表连接,多个目录页间通过双向链表连接 - 多个页信息被记录在
目录页中,当超过目录页数量限制会产生新的目录页,当目录页数量达到限制,会产生存储目录页元数据的目录页 - B+树创建的顶级父节点是常驻在内存中的
常见数据结构在mysql的使用
- hash结构
innodb不支持创建hash索引,hash索引的使用场景:java中的hashset
- 二叉搜索树
如果我们利用二叉树作为索引结构,那么磁盘的IO次数和索引树的高度是相关的。
树越矮胖,io次数越少
- avl树
- B树
B树除了叶子节点存储数据,其他的节点也存储数据
- B+树
B+树只有叶子节点存储完整的数据,同等大小的数据页,较B树就会更矮胖
mysql中索引
按照功能逻辑分类:普通索引,主键索引,唯一索引,全文索引
按照物理实现方式分类:聚簇索引,二级索引
按照作用的列分类:单列索引,联合索引
- 普通索引
plaintextcreate test( id int, name varchar(12), province_id int, index(province_id) );
- 主键索引
plaintextcreate test( id int auto_increment, name varchar(12), province_id int, primary key(id) );
- 唯一索引
plaintextcreate test( id int, name varchar(12) , province_id int, UNIQUE INDEX uk_name(name) );
- 全文索引
plaintextCREATE TABLE test4( id INT NOT NULL, info VARCHAR(255), FULLTEXT INDEX futxt_idx_info(info) ) ENGINE=MyISAM;
- 组合索引
plaintextcreate test( id int, name varchar(12), province_id int, index id_name_dx(id,name) );
适合创建索引的场景
- 需要经常过滤的列
- 需要经常group by分组的列
- 需要distinct大量去重的列
- 可以对join中需要连接的列创建
- 对需要创建索引的大key取前缀索引,即减少了索引占用的大小,也提高了查询的效率
- 使用最频繁的列放到联合索引的左侧,否则可能用不上创建的联合索引
版权声明