2012-05-03 33 views
0

我有一個小問題:主要和次要索引之間的性能有什麼區別?是什麼導致這種差異?主要索引與次要索引:性能差異

我在網上搜索,我已經看到二級索引存儲在另一個表中,所以這會減慢所有操作..但還有其他一些理由證明這種性能下降?

非常感謝

+0

以下鏈接可能會爲您提供一些指導:http://dev.mysql.com/doc/refman/5.0/en/innodb-index-types.html,http://www.xaprb.com/blog/2006/07/04/how-to-exploit-mysql-index-optimizations /和http://stackoverflow.com/questions/4419499/mysql-nosql-help-me-to-choose-the-right- one-on-a/4421601#4421601 –

+0

非常感謝!現在我會讀它們。 – satboy78

回答

4

簇表是B樹沒有「堆」部分 - 行直接存儲在集羣索引(主鍵)的B樹結構。 B-Tree的節點可以拆分或合併,因此物理位置或行可以更改,所以我們不能從輔助索引到行有簡單的「指針」,因此輔助索引必須包含主索引字段能夠可靠地識別行。

這對於Oracle,MS SQL Server是正確的,並且是also true for InnoDB

這意味着次級索引在羣集數據庫的表與基於堆的表二級索引,其中「胖」:

  • 降低了數據聚類,
  • 降低了高速緩存的有效性,
  • 使其維護成本更高,
  • 並且最重要的是,對查詢性能具有影響:
    • 通過二級索引查詢可能需要進行雙重查找 - 通過二級索引查找一個查找「關鍵」數據的查找,一個通過主查找,找到行本身(Oracle有一些有趣的優化以避免第二次查找,但據我所知,InnoDB並沒有) 。
    • 另一方面,二級索引自然會有更多的字段,所以在傳統的基於堆的索引需要表訪問的情況下,可以完全避免第二次查找。但是,基於堆的索引可以實現同樣的效果,只需向其中添加更多字段即可。

讓我引用Use The Index, Luke!:「索引組織表的優點和聚簇索引大多侷限於不需要第二個索引表」

這很遺憾,因爲MySQL不允許您獨立於存儲引擎選擇羣集。

+1

使用索引的帖子。盧克!非常好。清除了關於聚類指數和二級指標的很多想法。謝謝! – MasterV