在MySQL慢查詢日誌,我有以下查詢:尋找最佳的指數爲這個MySQL查詢
SELECT * FROM `news_items`
WHERE `ctime` > 1465013901 AND `feed_id` IN (1, 2, 9) AND
`moderated` = '1' AND `visibility` = '1'
ORDER BY `views` DESC
LIMIT 5;
這裏的結果說明:
+----+-------------+------------+-------+---------------------------------------------------------------------------------------+-------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------+-------+---------------------------------------------------------------------------------------+-------+---------+------+------+-------------+
| 1 | SIMPLE | news_items | index | feed_id,ctime,ctime_2,feed_id_2,moderated,visibility,feed_id_3,cday_complex,feed_id_4 | views | 4 | NULL | 5 | Using where |
+----+-------------+------------+-------+---------------------------------------------------------------------------------------+-------+---------+------+------+-------------+
1 row in set (0.00 sec)
當我手動運行此查詢時,它需要0.00秒,但由於某些原因,它出現在MySQL的慢日誌中,有時需要1-5秒。我相信這發生在服務器處於高負載狀態時。
下面是表結構:
CREATE TABLE IF NOT EXISTS `news_items` (
`item_id` int(10) NOT NULL,
`category_id` int(10) NOT NULL,
`source_id` int(10) NOT NULL,
`feed_id` int(10) NOT NULL,
`title` varchar(255) CHARACTER SET utf8 NOT NULL,
`announce` varchar(255) CHARACTER SET utf8 NOT NULL,
`content` text CHARACTER SET utf8 NOT NULL,
`hyperlink` varchar(255) CHARACTER SET utf8 NOT NULL,
`ctime` varchar(11) CHARACTER SET utf8 NOT NULL,
`cday` tinyint(2) NOT NULL,
`img` varchar(100) CHARACTER SET utf8 NOT NULL,
`video` text CHARACTER SET utf8 NOT NULL,
`gallery` text CHARACTER SET utf8 NOT NULL,
`comments` int(11) NOT NULL DEFAULT '0',
`views` int(11) NOT NULL DEFAULT '0',
`visibility` enum('1','0') CHARACTER SET utf8 NOT NULL DEFAULT '0',
`pin` tinyint(1) NOT NULL,
`pin_dttm` varchar(10) CHARACTER SET utf8 NOT NULL,
`moderated` tinyint(1) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
命名爲「視圖」索引包含僅1場 - 視圖。 我也有很多其他指標包括(例如):
feed_id + views + visibility + moderated
moderated + visibility + feed_id + ctime
moderated + visibility + feed_id + views + ctime
我使用的字段中提到的順序,因爲這是MySQL的開始使用他們的唯一原因。但是,我從來沒有在EXPLAIN中使用「使用where; using index」。
有關如何使EXPLAIN顯示「使用索引」的任何想法?
基本經驗法則:在決策環境中使用的任何字段(例如,用於「where」,「join」,「order by」等)應該被索引。您的索引看起來多餘。如果一個字段出現在多個索引中,它可能會更好地作爲它自己的單獨索引。例如如果moderated得到改變,你強制改變三個單獨的索引,而不是一個。 –
我會在找到最好的索引時刪除大部分索引。這只是我找到一個好索引所做的一個例子。無論如何,感謝您的評論,我會銘記在心。 – Greg