聚集索引 : clustered index
- 把这种正文内容本身就是一种按照一定规则排列的目录称为“聚集索引”。如:汉语字典本身按照a-z排序,认识拼音的字,可以直接翻到字典到特定区间查,所有读音类似的字都在一起,如 ”术“,”书“
- 每个table只能有一个聚集索引
- 最大好处就是能够根据查询要求,迅速缩小查询范围,避免全表扫描
非聚集索引 : nonclustered index
- 把这种目录纯粹是目录,正文纯粹是正文的排序方式称为“非聚集索引”。如:不认识的字,必须先按偏旁查找目录,然后再翻到指定页数;注意,偏旁一样的字分散在不同的地方,如 "认",“读”
误区:
- PK就是聚集索引:盲目把聚集索引建在PK上是浪费,如:PK是GUID,所以你根本不会做
id between :id1 and :id2的查询,那么就是在浪费 - 只要建立索引就能显著提高查询速度:无论是否经常使用聚合索引的其他列,但其起始列一定要是使用最频繁的列;查询中缺少起始列,index不起作用
| 使用聚集索引 | 使用非聚集索引 | |
|---|---|---|
| 列经常被分组排序 | 应 | 应 |
| 返回某范围内的数据 | 应 | 不应 |
| 一个或极少不同值 | 不应 | 不应 |
| 小数目的不同值 | 应 | 不应 |
| 大数目的不同值 | 不应 应 | |
| 频繁更新的列 | 不应 | 应 |
| 外键列 | 应 | 应 |
| 主键列 | 应 | 应 |
| 频繁修改索引列 | 不应 | 应 |
- B-Tree: 适合所有的数据类型,支持排序,支持大于、小于、等于、大于或等于、小于或等于的搜索
- Hash: 只支持等值查询,特别适用于字段VALUE非常长