1.MySQL数据库索引都有哪些数据结构
B+和HASH
2.聊下hash
hash查询是把key通过hash生成下标然后获取对应的值,它的主要特点是快速精确查询,但是不支持范围查询。如果要是做成索引,速度是很慢的,要全部扫描。
3.hash表在那些场景比较适合
等值查询的场景,就只有KV(Key,Value)的情况,例如Redis、Memcached等这些NoSQL的中间件。
有序数组,它在等值查询的和范围查询的时候都很Nice。
有序的适合静态数据,因为如果我们新增、删除、修改数据的时候就会改变他的结构。⽐如你新增⼀个,那在你新增的位置后⾯所有的节点都会后移,成本很⾼。
可以⽤来做静态存储引擎啊,⽤来保存静态数据,例如你2019年的⽀付宝账单,2019年的淘宝购物记录等等都是很合适的,都是不会变动的历史数据。
4.聊下二叉树\
⼆叉树是有序的,所以是⽀持范围查询的。
但是他的时间复杂度是O(log(N)),为了维持这个时间复杂度,更新的时间复杂度也得是O(log(N)),那就得保持这棵树是完全平衡⼆叉树了。
但是随着数据的增长,数就会变得很高,查询的成本就会随者树的增高而增加。
5.B树\
在同样的元素下,B树要比完全平衡的二叉树还要“矮”,因为B树的同一个节点可以存储多个元素。
B+树\
同样的元素,B+树的表示要⽐B树要“胖”,原因在于B+树中的⾮叶⼦节点会冗余⼀份在叶
⼦节点中,并且叶⼦节点之间⽤指针相连。
B+树是B树的升级版,只是把⾮叶⼦节点冗余⼀下,这么做的好处是为了提⾼范围查找的效率。
提⾼了的原因也⽆⾮是会有指针指向下⼀个节点的叶⼦节点,B+树⾥的元素也是有序的。\
总结
1.最左前缀匹配原则。MySQL会⼀直向右匹配直到遇到范围查询 (>,<,BETWEEN,LIKE)就停⽌匹配。
2.尽量选择区分度⾼的列作为索引,区分度的公式是 COUNT(DISTINCT col)/COUNT(*)。表示字段不重复的⽐率,⽐率越⼤我们扫描的记录数就越少。
3.索引列不能参与计算,尽量保持列“⼲净”。⽐如, FROM_UNIXTIME(create_time)='2016-06-06’就不能使⽤索引,原因很简单,B+树中存储的都是数据表中的字段值,但是进⾏检索时,需要把所有元素都应⽤函数才能⽐较,显然这样的代价太⼤。所以语句要写成 :create_time=UNIX_TIMESTAMP(‘2016-06-06’)。
4.尽可能的扩展索引,不要新建⽴索引。⽐如表中已经有了a的索引,现在要加(a,b)的索引,那么只需要修改原来的索引即可。
5.单个多列组合索引和多个单列索引的检索查询效果不同,因为在执⾏SQL时,MySQL只能使⽤⼀个索引,会从多个单列索引中选择⼀个限制最为严格的索引。 “合并索引”策略简单来讲,就是使⽤多个单列索引,然后将这些结果⽤“union或者and”来合并起来。