优化查询我有一个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