数据库索引

引言

前几天看到一篇文章,讲了一些数据库的注意事项。里面注意到 mysql innodb 为了避免二次查找用了索引覆盖技术。

详解

索引覆盖技术即索引里覆盖了所有的查询结果,可直接返回。
这个问题起因是在 innodb 里索引叶子节点存储的是主键,一般情况下还需要用主键进行二次查找,会大幅度降低效率。
这一点可以用延迟关联查询和一般查询来进行验证。
在其它数据库类似 postgresql 和 sql server 新版本都支持 index include,是为了在索引里就包含了一些需要的数据,以此来使用索引覆盖提高效率。

运用

但在现实使用的时候,很多时候并没有走索引覆盖,可能计划的美美的,但一运行,what??还不如不加索引呢。比如 postgresql 里面索引覆盖和 VACUUM 有关,因为其要查询数据是否更改。所以计划器会权衡来决定是否使用仅索引扫描。

总结

索引覆盖是一种机会性的,这点尤其在复杂查询时候很明显(需要由查询优化器来进行权衡)。我们可以在写 sql 或者创建索引时尽量朝这方面发展,但是它明显是不可靠的,所以最好能先预期到索引对其它方面的影响。