2011-09-28 83 views
0

我目前有一個摘要表來跟蹤我的用戶的帖子數,並且我在該表上運行SELECTs按照計數對它們進行排序,例如WHERE count > 10。現在我知道在WHERE子句中使用的列的索引可以加快速度,但由於這些字段也會經常更新,索引會提供更好還是更差的性能?此字段是否需要索引?

+1

廣義:具有上在所使用的列的索引WHERE子句將提供更快的讀取性能。唯一擔心的是額外寫入索引。懷疑這不會是一個問題。 –

回答

1

如果你有一個像

SELECT count(*) as rowcount 
FROM table1 
GROUP BY name 

查詢,那麼你不能把一個指標的數量,你需要把指數在group by場來代替。

如果你有一個名爲count

然後把指數在此查詢可以加快查詢字段,也可能沒有什麼區別可言:對count

SELECT id, `count` 
FROM table1 
WHERE `count` > 10 

是否指數會加快查詢的速度實際上取決於行數滿足where條款的百分比。如果它超過30%,MySQL (或任何有關此事的SQL)將拒絕使用索引。
它會固執地堅持做一個全表掃描。 (即讀取所有行)
這是因爲使用索引需要讀取2個文件(1個索引文件,然後是實際數據的真實表文件)。
如果選擇很大比例的行,讀取額外的索引文件是不值得的,只是按順序讀取所有行會更快。

如果只有幾行通集,使用索引將加快這一查詢很多

瞭解你的數據

使用explain select會告訴你哪些索引MySQL有可用的和一個它挑選並且(某種/以某種複雜的方式)爲什麼。

參見:http://dev.mysql.com/doc/refman/5.0/en/explain.html

0

索引通常以較差的插入,更新和刪除性能爲代價提供更好的讀取性能。根據索引的寬度和表中已經存在的索引的數量,折衷通常是值得的。在你的情況下,我敢打賭,整體表現(閱讀和寫作)與索引相比仍然會更好,但是你需要運行測試來確定。

0

它會提高讀取性能並降低寫入性能。如果表格是MyISAM,並且很多人在短時間內發佈信息,則可能會遇到MySQL正在等待鎖定的問題,最終導致崩潰。

0

沒有嘗試它,沒有辦法真正知道。很大程度上取決於讀取與寫入的比率,存儲引擎,磁盤吞吐量,各種MySQL調整參數等。您必須設置類似於生產並在之前和之後運行的仿真。

0

我認爲在添加索引之後寫入性能不太可能是一個嚴重的問題。

但是請注意,如果索引不夠選擇,那麼索引將不會被使用 - 如果超過例如10%的用戶擁有count > 10最快的查詢計劃可能不使用索引,只是掃描整個表。

相關問題