这里写目录标题
1. 什么是索引
(空间换时间)
索引是帮助mysql高效获取数据的数据结构
在mysql中,数据最终存储在硬盘中,(如果i/o操作不够多,查询就很慢)
2. 索引引用哪种数据结构:
(InnoDB不能手动创建hash,系统判断hash是否能起到加速效果,自适应创建。PS:可以关闭自适应)
Hash
B±tree
3. 为什么InnoDB使用B+_tree
二叉搜索树:可能存在顺序结构(链表树),存在遍历查找的结果,空间时间都浪费了
平衡二叉搜索树(AVL):实质是平衡二叉树,每个父节点只能有两个子节点,这就导致数据很多的时候树的深度太深,也就是查询的时候I/O操作多,倒是查询速度变慢,同时mysql每次从磁盘读取数据到内存默认是16KB,而对于搜索来说有用的数据只有一点点,导致读写资源浪费,即是节点只有一个关键字,每次I/O操作获取目标数据太少
B_tree:多路搜索树,绝对平衡,节点在同一水平线,每个节点关键字有N个,将数据分成若干开区间,节点内容包括(子节点索引和数据)
B+_tree:优点:1.、基于索引的扫表操作;2、叶子节点天然有序,基于索引排序更加优秀;3、每次I/O操作读取的索引更多,吞吐能力更强。
缺点:每次访问数据,必然要访问叶子节点。
4. Mysql索引失效的原理,
B±tree:联合索引(a,b)遵循当a有序且相等的时候,b也是有序的,遵循最佳左前缀原则的语句,可以判断联合索引,而只有单值匹配的话只能全盘匹配,
5. 为什么B+_tree建议ID递增,为什么不用uuid
递增ID插入数据的时候是尾插数据,而uuid随机数插入可能设中间插入,效率低,同时uuid数据长度比较长,每次IO读取量比较少。
6. 聚集索引
只有主键索引是聚集索引,其他都是非聚集索引
7. 稀疏索引
MyISAM引擎:不管是主键索引、唯一索引或者普通索引,其索引都属于稀疏索引,通过索引找到存储数据的myd的地址,在通过地址读取myd中的数据
InnoDB引擎:非主键索引(稀疏索引)存储相关键位和它对应的主键值,包含两次查找,在非主键索引中找到主键索引的ID,在通过ID在主键索引中找到数据
PS:如果InnoDB非主键索引直接存储数据的话,存在一致性问题(每次维护需要维护所有索引)和空间浪费的问题
8. 为什么InnoDB要求一定要建立主键索引?
- 如果不建立主键索引,系统会自动生成主键索引——隐藏主键,这个时候占用空间是 int(6byte),而主动建立主键索引只需要int(4byte)
- 处理事务的时候,主键索引使用的是行锁,隐藏主键索引使用的是表锁
9. 最左匹配原则:
当使用联合索引的时候,以最左边的键创建B+_tree,然后从左边开始进行匹配,“索引列上少计算,范围之后全失效”,离散型极差之后,最后一个索引就可能用不上了
10. 覆盖所引:
通过索引项的信息可以直接返回所查询的列,则该索引成为查询sql的覆盖所引,不用产生回表操作。