mysql 之数据结构和索引失效
MySQL 底层的数据结构是B+树,展开来讲,为什么不是哈希索引,为什么不是平衡二叉树,为什么不是b树。
哈希索引
优点:
查找效率高
缺点:
无序,所以不能进行范围查找(大于、小于)、不能排序
平衡二叉树特点:
左侧树和右侧树比较平衡,两树相差的高度不会大于1
缺点:
随着树的高度增加,查找速度越慢
回旋查找更慢,如范围查找情况
B树特点:
可以一个节点存储2个值(解决平衡二叉树高度问题,查找数据更快)
B+树特点:
B树的基础上,多了箭头,也构成了单向链表,把所有的树进行了一个链表的排序(解决回旋查找问题,提高了范围查找、排序速度)
上图是单值索引,下面讲一下联合索引:
在a相等的情况下b有序,b无序时索引失效。所以使用联合索引时,要遵循最佳左前缀法则:
索性失效无非就2种情况:
1.破坏了索性结构导致索引无法使用; 2.全表扫描比走索引快。索引只是加快查询效率的手段,mysql内部判断走全表比走索引快为啥还要走索引,所以索引就失效了。 3.看数据库版本(之前的版本默认引擎是myisam,之后是innodb)
为了方便记忆,索引失效七字诀:模型数空运最快
模:模糊查询LIKE以%开头 型:数据类型错误 数:对索引字段使用内部函数 空:索引列是NULL 运:索引列进行四则运算 最:复合索引不按索引列最左开始查找 快:全表查找预计比索引更快
比如:>、or、in、!=、is not null等,索引就会失效
exists 替代 in (当子查询[内部表]数据量比外部表大时,exists 的效率要优于 in,反之)
学习路径:
https://www.bilibili.com/video/BV1yT4y1w7FS?spm_id_from=333.337.search-card.all.click