我有一个 INNODB 表levels
:
+--------------------+-------------+------+------+ ---------+--------+ | 领域 | 类型 | 空 | 钥匙 | 默认 | 额外 | +--------------------+-------------+------+------+ ---------+--------+ | 编号 | 整数(9) | 否 | 优先级 | 空 | | | 级别名称 | varchar(20) | 否 | | 空 | | | 用户 ID | 整数(10) | 否 | | 空 | | | 用户名 | varchar(45) | 否 | | 空 | | | 评级 | 十进制(5,4) | 否 | | 0.0000 | | | 票 | 整数(5) | 否 | | 0 | | | 戏剧| 整数(5) | 否 | | 0 | | | 发布日期 | 日期 | 否 | 穆尔 | 空 | | | 用户评论 | varchar(255) | 否 | | 空 | | | 可玩角色 | 整数(2) | 否 | | 1 | | | is_featured | 小整数(1) | 否 | 穆尔 | 0 | | +--------------------+-------------+------+------+ ---------+--------+
大约有 400 万行。由于前端功能的原因,我需要使用各种过滤器和排序来查询此表。它们在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 子句中存在相同的两个索引列。
我的问题是 ORDER by plays
or的查询rating
。我知道我要介绍第三列,但在我的一生中,尽管尝试了我能想到的几乎所有变体,但我无法获得一个运行良好的索引:每个顺序中所有三个或四个的复合索引,以及很快。也许查询可以用不同的方式编写?
我应该补充一点rating
,并且plays
总是被查询为DESC
. 只能date_published
是DESC
或ASC
。
任何建议都非常感谢。TIA。