一、索引
在MySQL数据库中索引是一种数据结构——B+树,使用索引将提高大数据量表的查询速度。可能到这没法理解为什么建立索引检索速度就提高了呢?
二、B+树
B树(平衡二叉树)的变种,显著特点有查询效率更稳定、结点中元素个数=子树元素个数。
详细介绍看这后面这篇博客,什么是B+Tree——冬瓜蔡。
三、聚集索引
MySQL中设定主键为聚集索引,不可更改。建立聚集索引后,根据主键字段生成B+树。
该棵树的叶子节点中每个元素包含了该条记录的所有列,聚集索引与非聚集索引的一大差别就体现在这。
比如下面这张学生成绩表:
id | name | score |
1 | 张三 | 90 |
2 | 李四 | 85 |
... | ... | ... |
100 | 小明 | 100 |
如果id是主键,聚集索引。那么代表索引的那棵B+树可能长成下面这样:
所以当你使用类似下面以id作为where查询条件的SQL时,会自动检索这棵树,而不是原始的存储结构(猜想是数组)。
SELECT id,name.score WHERE id = 1;
当检索到结点元素值为25时,一同查询到了名字和分数这两个非索引字段,此过程不存在二次查询。
所以索引查的是B+树,当数据量大时,检索速度当然要比遍历来的快!
三、非聚集索引
当然,它也是B+树,但是叶子节点长的和聚集索引生成的树不一样。还是上面的成绩表,如果以id字段建立索引:
CREATE INDEX 索引名 ON table_name(id);
那么这课树可能长下面这样:
此时查询where条件为id,检索该棵树,仅在select字段(投影)都被当前索引覆盖才不会进行二次查询。
-- 使用非聚集索引,索引覆盖查询字段,不发生二次查询
SELECT id where id=1;
-- name字段需的值要通过指针二次查询
SELECT id,name where id=1;
四、总结
- 建立索引将创建B+树,条件为索引字段的查询为对树的检索;
- 聚集索引比非聚集快,非聚集可能存在二次查询,可以通过复合索引解决;
- 在数据量大的情况下,对树(索引)的检索比遍历数组快;
- 索引应当在表创建时建立,索引字段不宜频繁修改。
更多关于索引更详细的介绍可以看后面这篇文章,聚集索引与非聚集索引的总结——{-)大傻逼。