一、mysql索引结构B+树原理
B树开始就是n树,不是二叉树
B树的非叶子结点存储了数据,导致层级会很深,每一层又有数据又有索引。
B+树只有叶子结点存储数据,其余都是存储索引,增加了每层存取索引的数量(3层结构就可以支持千万条数据查询)。
二、索引基本知识
- 索引的优点
- 1、大大减少了服务器需要扫描的数据量
- 2、帮助服务器避免排序和临时表(order by是全排序--比较慢,可以使用索引排序,因为索引已经排好顺序了)
- 3、将随机io变成顺序io(顺序io比随机io快多了)
- 索引的用处
- 1、快速查找匹配WHERE子句的行
- 2、从consideration中消除行,如果可以在多个索引之间进行选择,mysql通常会使用找到最少行的索引
- 3、如果表具有多列索引,则优化器可以使用索引的任何最左前缀来查找行
- 4、当有表连接的时候,从其他表检索行数据
- 5、查找特定索引列的min或max值(索引有排序,取一头一尾)
- 6、如果排序或分组时在可用索引的最左前缀上完成的,则对表进行排序和分组
- 7、在某些情况下,可以优化查询以检索值而无需查询数据行
- 索引的分类
- 主键索引
- 唯一索引(数据库默认会给唯一键建索引,而数据库的主键是唯一切非空值)
- 普通索引
- 全文索引(varchar,char,text类型)
- 组合索引
- 面试技术名词
- 回表
- (建普通索引的时候,索引的叶子节点存储的不是整行数据,所以查到这部分数据后,如果select *,则回重新用
- 回表
主键索引的B+树里面查出整行数据,就是回表了)
- 覆盖索引
- (回表的基础上,不用select*,只查出索引字段对应的id跟索引字段,则可以不用回表,这种操作就叫覆盖索引)
- 最左匹配
- (针对组合索引时,假如组合索引name跟age,查询中会先匹配name,后匹配age,如果查询条件只有个age,则无法触发该组合
索引,因为会最先匹配左边的)
- 索引下推
- (针对组合索引,先过滤掉数据再进行索引交集的一种策略(提前在存储引擎层做过滤,而不是在Service层做判断,就是下推的实际意义))
- 索引采用的数据结构
- 哈希表
- B+树(性能综合来说相对较优解)
- 索引匹配方式(6种)
- 全值匹配
- 全值匹配指的是和索引中的所有列进行匹配
- explain select * from staffs where name = 'July' and age = '23' and pos = 'dev';
- 全值匹配指的是和索引中的所有列进行匹配
- 匹配最左前缀
- 只匹配前面的几列
- explain select * from staffs where name = 'July' and age = '23';
- explain select * from staffs where name = 'July';
- 只匹配前面的几列
- 匹配列前缀
- 可以匹配某一列的值的开头部分
- explain select * from staffs where name like 'J%';
- explain select * from staffs where name like '%y';
- 可以匹配某一列的值的开头部分
- 匹配范围值
- 可以查找某一个范围的数据
- explain select * from staffs where name > 'Mary';
- 可以查找某一个范围的数据
- 精确匹配某一列并范围匹配另外一列
- 可以查询第一列的全部和第二列的部分
- explain select * from staffs where name = 'July' and age > 25;
- 可以查询第一列的全部和第二列的部分
- 只访问索引的查询
- 查询的时候只需要访问索引,不需要访问数据行,本质上就是覆盖索引
- explain select name,age,pos from staffs where name = 'July' and age = 25 and pos = 'dev';
- explain select * from staffs where name = 'July' and age = 25 and pos = 'dev';【这个就不是覆盖索引了,因为用了*,会进行回表操作】
- 查询的时候只需要访问索引,不需要访问数据行,本质上就是覆盖索引
- 全值匹配
三、哈希索引
数据库重启后,memory中的内容会消失,各类行政区 当需要存储大量的URL,并且根据URL进行搜索查找,如果使用B+树,存储的内容就会很大 select id from url where url="" 也可以利用将url使用CRC32(把一个很长的字符串变成一个整数值)做哈希,可以使用以下查询方式: select id fom url where url="" and url_crc=CRC32("") 此查询性能较高原因是使用体积很小的索引来完成查找
|
四、组合索引
|
五、聚簇索引
导致索引频繁更新,效率极其低下)
|
六、非聚簇索引
- 非聚簇索引(MyISAM存储引擎)
- 数据文件跟索引文件分开存放
七、覆盖索引
|