哈希索引
哈希索引是基于哈希表实现的,对于每一行数据,存储引擎会对索引列进行哈希计算得到哈希码,并且
哈希算法要尽量保证不同的列值计算出的哈希码值是不同的,将哈希码的值作为哈希表的key值,将指向
数据行的指针作为哈希表的value值。这样查找一个数据的时间复杂度就是O(1),一般多用于精确查找。
4.7. Hash索引和B+树索引的区别?
哈希索引不支持排序,因为哈希表是无序的。
哈希索引不支持范围查找。
哈希索引不支持模糊查询及多列索引的最左前缀匹配。
因为哈希表中会存在哈希冲突,所以哈希索引的性能是不稳定的,而B+树索引的性能是相对稳定
的,每次查询都是从根节点到叶子节点。
4.8. 为什么B+树比B树更适合实现数据库索引?
由于B+树的数据都存储在叶子结点中,叶子结点均为索引,方便扫库,只需要扫一遍叶子结点即
可,但是B树因为其分支结点同样存储着数据,我们要找到具体的数据,需要进行一次中序遍历按
序来扫,所以B+树更加适合在区间查询的情况,而在数据库中基于范围的查询是非常频繁的,所以
通常B+树用于数据库索引。
B+树的节点只存储索引key值,具体信息的地址存在于叶子节点的地址中。这就使以页为单位的索
引中可以存放更多的节点。减少更多的I/O支出。
B+树的查询效率更加稳定,任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查
询的路径长度相同,导致每一个数据的查询效率相当。
4.9. 索引有什么分类?
1. 主键索引:名为primary的唯一非空索引,不允许有空值。
2. 唯一索引:索引列中的值必须是唯一的,但是允许为空值。唯一索引和主键索引的区别是:
UNIQUE 约束的列可以为null且可以存在多个null值。UNIQUE KEY的用途:唯一标识数据库表中
的每条记录,主要是用来防止数据重复插入。创建唯一索引的SQL语句如下:
3. 组合索引:在表中的多个字段组合上创建的索引,只有在查询条件中使用了这些字段的左边字段
时,索引才会被使用,使用组合索引时遵循最左前缀原则。
4. 全文索引:只有在MyISAM引擎上才能使用,只能在CHAR,VARCHAR,TEXT类型字段上使用全文索
引。
4.10. 什么是最左匹配原则?
如果 SQL 语句中用到了组合索引中的最左边的索引,那么这条 SQL 语句就可以利用这个组合索引去进
行匹配。当遇到范围查询(>、<、between、like)就会停止匹配,后面的字段不会用到索引。
对(a,b,c)建立索引,查询条件使用 a/ab/abc 会走索引,使用 bc 不会走索引。
对(a,b,c,d)建立索引,查询条件为 a = 1 and b = 2 and c > 3 and d = 4 ,那么,a,b,c三个字段能
用到索引,而d就匹配不到。因为遇到了范围查询!