3 回答

TA貢獻1801條經驗 獲得超16個贊
查閱諸如“ 更多地掌握索引藝術”之類的演示。
更新12/2012:我已經發(fā)布了我的新演示文稿:《如何設計索引,真的》。我在2012年10月在圣塔克拉拉的ZendCon和2012年12月在倫敦Percona Live上提出了這一點。
設計最佳索引是一個必須與您在應用程序中運行的查詢相匹配的過程。
很難建議任何通用規(guī)則,這些規(guī)則關于哪些列最適合索引,或者是否應該索引所有列,不索引任何列,哪些索引應該跨越多列等等,這取決于您需要運行的查詢。
是的,有一些開銷,所以您不應不必要地創(chuàng)建索引。但是您應該創(chuàng)建索引,以使您需要快速運行的查詢受益。索引的開銷通常遠遠超過其好處。
對于VARCHAR(2500)列,您可能要使用FULLTEXT索引或前綴索引:
CREATE INDEX i ON SomeTable(longVarchar(100));
請注意,如果您正在搜索可能位于該長varchar中間的單詞,常規(guī)索引將無濟于事。為此,請使用全文索引。

TA貢獻1844條經驗 獲得超8個贊
我不會在其他答案中重復一些好的建議,但會補充:
復合指數(shù)
您可以創(chuàng)建復合索引-包含多個列的索引。MySQL能夠從使用這些留下來的權利。因此,如果您有:
Table A
Id
Name
Category
Age
Description
如果您的復合索引按該順序包括Name / Category / Age,則這些WHERE子句將使用索引:
WHERE Name='Eric' and Category='A'
WHERE Name='Eric' and Category='A' and Age > 18
但
WHERE Category='A' and Age > 18
不會使用該索引,因為必須從左到右使用所有內容。
說明
使用Explain / Explain Extended可以了解MySQL可以使用哪些索引,以及它實際選擇的索引。 MySQL 每個查詢只使用一個鍵。
EXPLAIN EXTENDED SELECT * from Table WHERE Something='ABC'
慢查詢日志
打開慢速查詢日志以查看哪些查詢運行緩慢。
寬列
如果您有一列很寬的列,其中大多數(shù)區(qū)別出現(xiàn)在前幾個字符中,則只能使用索引中的前N個字符。示例:我們有一個ReferenceNumber列定義為varchar(255),但在97%的情況下,引用數(shù)為10個字符或更少。我將索引更改為僅查看前10個字符,并顯著提高了性能。
添加回答
舉報