如何优化各种类型的 MySQL 查询索引

Hal*_*000 8 mysql innodb performance optimization index-tuning query-performance

我有一个 INNODB 表levels

+--------------------+--------------+------+-----+ -------+-------+
| 领域 | 类型 | 空 | 钥匙 | 默认 | 额外 |
+--------------------+--------------+------+-----+ -------+-------+
| 身份证 | 整数(9) | 否 | PRI | 空 | |
| 级别名称 | varchar(20) | 否 | | 空 | |
| 用户 ID | 整数(10) | 否 | | 空 | |
| 用户名 | varchar(45) | 否 | | 空 | |
| 评级 | 十进制(5,4) | 否 | | 0.0000 | |
| 投票 | 整数(5) | 否 | | 0 | |
| 戏剧| 整数(5) | 否 | | 0 | |
| date_published | 日期 | 否 | 多| 空 | |
| 用户评论 | varchar(255) | 否 | | 空 | |
| playable_character | 整数(2) | 否 | | 1 | |
| is_featured | tinyint(1) | 否 | 多| 0 | |
+--------------------+--------------+------+-----+ -------+-------+

有大约 400 万行。由于前端功能,我需要使用各种过滤器和排序来查询此表。他们都在playable_characterratingplays,和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;
Run Code Online (Sandbox Code Playgroud)

我应该补充一点ratingplays并且总是被查询为DESC. 只有date_published可能是DESCASC

我从一个idx_date_char(date_published, playable_character)在第一个示例查询中效果很好的索引开始。根据其他一些答案,我更改为另外两个索引(date_published、playable_character、plays)和(date_published、playable_character、 rating)。

第一个查询仍然运行得非常快,但是在 EXPLAIN 中发生了一些不寻常的事情,当 player_character = x 超过一定的行数(~700,000)时:USING WHERE 在 EXPLAIN 中弹出。

因此,第一个问题是查询或索引是否有任何改进可能,其次,应更改 MySQL 设置以允许大型结果集。

任何建议都非常感谢。TIA。

Min*_*uba -2

这里的每个人都忽略了一点——有问题的 SQL 正在检索 1000 行。除非缓存大部分数据,否则无法快速检索 1000 行。如果数据未缓存,则必须顺序执行 1000 次随机读取才能检索数据。

良好的基于​​磁盘的存储和快速磁盘将为您提供每秒约 200 次读取。即使在 RAID 中,普通磁盘也无法管理 100 个。这意味着即使使用最好的索引也需要 10 秒以上才能获得结果。

因此从长远来看,这样的数据模型和查询将不起作用。现在,当您命中缓存数据时,查询运行速度很快。