- 创建索引语法
CREATE [UNIQUE | FULLTEXT | SPATIAL] INDEX index_name
[index_type]
ON tbl_name (key_part,...)
[index_option]
[algorithm_option | lock_option] ...
key_part: {col_name [(length)] | (expr)} [ASC | DESC]
index_option: {
KEY_BLOCK_SIZE [=] value
| index_type
| WITH PARSER parser_name
| COMMENT 'string'
| {VISIBLE | INVISIBLE}
| ENGINE_ATTRIBUTE [=] 'string'
| SECONDARY_ENGINE_ATTRIBUTE [=] 'string'
}
index_type:
USING {BTREE | HASH}
algorithm_option:
ALGORITHM [=] {DEFAULT | INPLACE | COPY}
lock_option:
LOCK [=] {DEFAULT | NONE | SHARED | EXCLUSIVE}
-
常见索引结构
HASH、B+Tree
-
深入理解B+Tree
1)哈希索引
哈希索引只支持等值比较,包括=、in()、<=>,查询速度非常快,不支持范围查找。
2)二叉查找树
每个节点最多有两个子节点,左子节点小于根节点,右子节点大于根节点。
结论:二叉查找树可以做范围查询,但是在极端情况下,二叉查找树会退化为线性链表,二分查找会退化为遍历查找。
3)自平衡二叉树
-
a、红黑树
结论:通过自平衡解决退化了线性链表的问题,但是表“右倾”,并没有真正解决树的平衡问题。 -
b、平衡二叉树(AVL)
在二叉树基础上,左子树和右子树的高度差最大为1。
结论:解决了红黑树的“右倾”问题,但是数据量大的情况下,树的高度会很高,需要更多的I/0。
4)B-Tree
在平衡二叉树的基础上,通过多叉(一个节点可以有多个值),降低树的高度,提升查询效率,但是没有解决“回表问题”。
5)B+Tree
在B-Tree的基础上,叶子节点增加有序链表,包含所有节点,非常适合范围查询,但是非叶子节点存在冗余。