mysql索引的本质
磁盘存取原理
说明:
磁盘逆时针旋转,找到对应的数据后(旋转时间),然后磁头再左右移动读取数据(寻道时间),这就是取一行数据的过程,也叫一次IO。
如果不加索引的情况,每查一条数据数据都要经历一次磁盘IO,比如某表由十条数据,要取出最后一条数据那么需要经过十次IO,效率低下。
mysql全文索引
ALTER TABLE m1 ADD FULLTEXT INDEX name_idx (`name`) WITH PARSER ngram;
SELECT * FROM m1 WHERE MATCH (name) AGAINST ('大爷*');
mysql innodb将索引从磁盘加载到内存的最小单位?
最小单位是16kb,也就是一个page,默认16kb
为什么是固定的?
因为在操作系统中,当你访问一块数据的时候,操作系统会认为它相邻的数据马上也会被加载
每加载树的一个节点,就是一次磁盘的IO
mysql用是B+树
B树
B+树
1:B+树关键字的个数和分叉数是相等的
2:非叶子节点不存储数据(地址)
3:只有叶子节点才会存储数据
4:每个数据查询的IO次数都一样
5:叶子节点是一个有序的链表结构
链表有什么好处?
正常情况查找B树都是通过根节点前序、中序、后序去查找,如果有了链表,全表扫描的时候直接从叶子节点去查找就行了
排序能力更强,比如要查一个where xx>20,这种搜索只需要在叶子节点通过链表查询相邻的数据就行了。
hash
mysql还有一种索引结构就是hash,hash的时间复杂度是O(1),比B+树更快,但是hash索引只针对等值查询,如果sql中有范围查询是无法用到hash方式的索引,但是hash索引会有hash冲突,在innoDb中,mysql是不会将hash放到字段上的
一般是page页会放到内存中,为了进一步提升访问速度,会有个内存缓冲池,而这个缓存池中有些page是热点的,所以它会为这些热点页去建立hash索引
本文地址:https://blog.csdn.net/qq_38081917/article/details/107647521
下一篇: 小米有望今年上市?雷军或将成为中国首富