Skip to content

Latest commit

 

History

History
46 lines (36 loc) · 1.64 KB

db_index.md

File metadata and controls

46 lines (36 loc) · 1.64 KB

关于索引

数据库的索引包括了覆盖索引、前缀索引、索引下推概念。
覆盖索引:
所有的索引树都包含了主键,所以,下面这条查询主键 id 的语句可以直接利用索引树中的数据返回结果:
select id from Table where x=y
如果变成 select * from... 就无法利用覆盖索引特性了。

前缀索引:最左前缀选择
索引:(a, b)
联合索引满足最左 N 个字段原则,相当于 2 个索引的效果,分别是:(a)、(a, b)
索引(c)
单个索引满足最左 N 个字符选择
c like 'prefix%' 也可以利用上这个索引。

索引下推:
索引:(a, b)
select * from table where a=? and b=? and c=?
这个查询中,a, b字段的值的过滤直接就可以在索引树中完成,大大降低了回表次数。
重建主键,相当于重建整个表。

重建索引(非主键),可以消除因为索引删除、页分裂的原因导致的页空洞问题,提高页面的利用率,节省空间。
如果存在联合索引 (a, b),基于索引的最左前缀原则,那么就没有必要再为 (a) 单独创建索引了。
如果既有基于联合索引 (a,b) 的查询,又有基于 a, b 各自单独的查询,那么创建 (a, b)、(b) 两个索引就够了。
这 2 个索引怎么组合以下会节省空间呢?
假如 a 字段是一个数字类型
    b 字段是一个字符串,表示的是如用户名、地址之类的
此时,选择 (b, a) (a) 会更节省空间,因为 (a) 占用索引空间明显会比 (b) 小

回表

1