2011-11-12 64 views
2

表:我應該選擇哪個指數(MySQL的)

CREATE TABLE `table1` (
    `f1` int(11) NOT NULL default '0', 
    `f2` int(4) NOT NULL default '0', 
    `f3` bigint(20) NOT NULL default '0', 
    PRIMARY KEY (`f1`) 
) TYPE=MyISAM 

查詢:

select `f1` from table1 where `f2`=123 order by `f3` desc; 

我想創建一個 「覆蓋索引」 此查詢

ALTER TABLE `table1` ADD INDEX (`f2`,`f3`,`f1`); 

ALTER TABLE `table1` ADD INDEX (`f2`,`f1`,`f3`); 

我應該選哪個?

+0

我懷疑他們中的任何一個都會以顯着的方式幫助你。 – NullUserException

+0

@NullUserExceptionఠ_ఠ我確定有用,但我不知道哪個更好 – Koerr

回答

2

第一個。 MySQL可以使用任一索引來獲取結果集,而無需從實際表中讀取。第一個索引稍微高效一些,因爲不需要執行重新排序行的額外步驟。

+1

是的,第一個索引只需要順序讀取與WHERE子句匹配的那部分索引,而不需要任何額外的排序。它爲改善查詢性能提供了最大的機會。 –

0

爲你查詢你只需要在f2上的索引。

,如果你有像whereclause查詢 「其中f1 = 12和f2 = 15」,你可能想在f1和f2的指數了。但是,根據數據和完整查詢,主鍵可能會更快地爲您提供結果。

如果您有3個查詢(在where子句中),您(可能)需要一個覆蓋3個字段的索引。

15年來,我從來沒有面臨需要創建一個僅用於排序結果的索引。這個操作非常快。什麼是慢找到行(where子句),和不同的集匹配(連接)。

現在如果您不確定,請同時創建。你是否使用explain_plan查詢和檢查哪一個mysql使用?然後放下其他^^。

+0

添加'f3'來索引以避免文件索引,'f1'索引以覆蓋索引。 **覆蓋索引:**包含(或「覆蓋」)滿足查詢所需的所有數據的索引稱爲覆蓋索引。覆蓋索引可以是一個非常強大的工具,可以顯着提高性能。 – Koerr

+0

是啊是啊是的,但非* self *涵蓋索引和索引大小使他們...雙刃劍。正如你所說,***在*** *條件下可以非常強大。 ... 2月29日哪個。 – roselan

相關問題