sql&db

数据库的回表和覆盖索引

字号+ 作者:风潇潇 来源:原创 2016-09-28 10:23 我要评论( )

做开发,或者以后要成为架构师,了解数据库的一些概念是非常重要的,要做的不只是了解,更应该是理解和运用

下面只是用数据库来做概念的解说。并非杂乱无章,说到oracle,然后又无故说到mysql,对于回表或者覆盖索引,对数据库基本都有类似的机制,oracle里有rowid,mysql里面应该也有类似的引用可能不叫rowid,可能是叫别的。

什么叫做回表

oracle里面就有个很明显的物理id。叫rowid,这个是全局唯一的。rowid是物理结构上的,在每条记录insert到数据库中时,都会有一个唯一的物理记录。
回表:在数据中,当查询数据的时候,在索引中查找索引后,获得该行的rowid,根据rowid再查询表中数据,就是回表。

这里举个例子

SELECT c1,c2,c3  FROM TEST_TABLE WHERE c1=1  

如果c1列建立了索引。首先会从索引里面根据c1=1 查找出c1的rowid,然后根据rowid去找到数据块中对应的数据,将c1,c2,c3 查出来。

如果c1没有建立索引,那就需要进行全表扫描。到数据块中扫描一番,这样性能不好。


覆盖索引


MySQL可以利用索引返回SELECT 列表中的字段。而不必根据索引再次读取数据文件。包含所有满足查询需要的数据的索引成为覆盖索引(Covering Index)
。也就是平时所说的不需要回表操作。
判断标准:
 在查询前面使用explain,可以通过输出的extra列来判断,对于一个索引覆盖查询,显示为using index,MySQL查询优化器在执行查询前会决定是否有索引覆盖查询。
 也就是说当前查询所需要的数据直接就可以在索引里面查得到。有时候根据业务,建立多列索引,使用覆盖索引,可以取得相当好的性能优化


转载请注明出处。

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
网友点评
评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)