MySql的索引?
1 Hash索引?
通过hashCode去匹配,查找数据库中唯一值的速度很快,不支持范围查找,联合索引也不支持
只适用于select * from table where id = 5;只适用于等于的情况
2红黑树?
数据量大的情况下,红黑树的树太高了,查询最深处的数据时,磁盘读取次数较多
3 B树? (多叉搜索树) //MongoDB使用的数据结构
B树的每个节点都存储key-value,时间复杂度与节点位置有关,最好是O(1),B树的每个节点与value连在一起,无法进行区间查找.
4 B+树? //MySQL使用的数据结构
所有的数据由存储在叶子节点,时间复杂度固定为树的深度,logN,B+树的每个节点都连在一起,可以进行范围查找.
B树的分裂公式:[ceil(m/2)-1]<=n<=m-1
----m: 表示B树有m个叉
----n: 表示每个节点最多包含的数据量
5 联合索引?
联合索引必须是按照顺序使用,而且需要全部使用
建立一个 a+b+c的索引
实际上还是只有一颗索引树,最左匹配原则,谁在最左边,就以谁来建索引
Select * from user where a = 1 and b = 2 and c = 3 //会走全部索引
Select * from user where b = 2 and c = 3 and a = 1//mysql做了优化,也可以使用索引
Select * from user where a = 1 //会走a索引
Select * from user where b = ‘xxx’ and c = 10 //索引会失效
Select * from user where a = 1 and c = “xxx” //会走a的索引,因为没走b索引,c也会失效
Select * from user where a = 1 and b > 2 and c = 3 //会走a,b的索引,c的索引会失效