一、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存储引擎) 
     - 数据文件跟索引文件分开存放
 
七、覆盖索引
| 
 
 | 




















