優化查詢我有一個InnoDB表levels
:在MySQL5.6
+--------------------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------------------+--------------+------+-----+---------+-------+ | id | int(9) | NO | PRI | NULL | | | level_name | varchar(20) | NO | | NULL | | | user_id | int(10) | NO | | NULL | | | user_name | varchar(45) | NO | | NULL | | | rating | decimal(5,4) | NO | | 0.0000 | | | votes | int(5) | NO | | 0 | | | plays | int(5) | NO | | 0 | | | date_published | date | NO | MUL | NULL | | | user_comment | varchar(255) | NO | | NULL | | | playable_character | int(2) | NO | | 1 | | | is_featured | tinyint(1) | NO | MUL | 0 | | +--------------------+--------------+------+-----+---------+-------+
共有約4萬行。由於前端功能,我需要使用各種過濾器和排序來查詢此表。他們在playable_character
,rating
,plays
和date_published
。 date_published
可以過濾顯示在最後一天,每週,每月或任何時間(過去3年)。還有分頁。因此,根據用戶選擇,查詢可以看,例如,像這些之一:
SELECT * FROM levels
WHERE playable_character = 0 AND
date_published BETWEEN date_sub(now(), INTERVAL 3 YEAR) AND now()
ORDER BY date_published DESC
LIMIT 0, 1000;
SELECT * FROM levels
WHERE playable_character = 4 AND
date_published BETWEEN date_sub(now(), INTERVAL 1 WEEK) AND now()
ORDER BY rating DESC
LIMIT 4000, 1000;
SELECT * FROM levels
WHERE playable_character = 5 AND
date_published BETWEEN date_sub(now(), INTERVAL 1 MONTH) AND now()
ORDER BY plays DESC
LIMIT 1000, 1000;
我開始了一個索引idx_date_char(date_published, playable_character)
這裏的第一個例子查詢工作偉大 - 基本上什麼這是由date_published
訂購。使用EXPLAIN,我得到'使用索引條件',這很好。我想我明白爲什麼索引能夠工作,因爲在WHERE和ORDER BY子句中存在相同的兩個索引列。
我的問題是通過plays
或rating
訂購的查詢。我知道我正在介紹第三列,但在我的生活中,我無法得到一個效果良好的索引,儘管嘗試了我能想到的每一個變化:每個訂單中三到四個組合索引,以及等等。也許查詢可能寫入不同?
我要補充一點,rating
和plays
總是質疑爲DESC
。只有date_published
可能是DESC
或ASC
。
任何建議非常感謝。 TIA。
你有沒有嘗試覆蓋索引,像'ON(date_sub ASC,playable_character ASC,rating DESC)''?請注意,第一列按升序排列,最後一列以降序排列,因爲您的查詢具有'ORDER BY rating DESC' + limit ... – a1ex07
對於第一個查詢,'(playable_character,date_published)'上的索引會更好。對於第二和第三,它更復雜,不容易優化。 –
@ypercube - 我本可以發誓,昨天速度較慢,並且在EXPLAIN額外專欄中給了我一個'where'。但你是對的,我只是比較它們,它更快(並且是'使用索引條件')。 – Hal50000