给出名为“user_posts”的 mySQL 表,其中包含以下相关字段:
- 用户 ID
- 用户状态
- 影响者状态
在所有三个字段中建立索引
我运行缓慢的查询在这里,而且我还创建了一个 dbFiddle 。解释的输出位于 dbfiddle 中:
SELECT
P.user_post_id,
P.user_id_fk,P.post_type,
P.who_can_see_post,
P.post_image_id,P.post_video_id,
U.user_name, U.user_fullname,U.influencer_status
FROM user_posts P FORCE INDEX (ix_user_posts_post_id_post_type)
INNER JOIN users U FORCE INDEX (ix_status_istatus)
ON P.user_id_fk = U.user_id
WHERE
U.user_status='1' AND
U.influencer_status = '1' AND
(P.who_can_see_post IN('everyone','influencer','friends')) AND
(P.post_type IN('image','video'))
AND p.user_post_id > 30
ORDER BY
P.user_post_id
DESC LIMIT 30
查询时间非常长,大约 6-15 秒。否则数据库不是很忙,并且在其他查询上表现良好。
我显然想知道为什么查询这么慢。
有没有办法准确地告诉 mySQL 到底是什么原因导致了这么长时间?或者我需要进行任何更改才能使查询运行得更快吗?
最佳答案
您的 ix_status_istatus
键的定义阻止它被用于优化 WHERE
子句,因为它包含 user_id
,而该 user_id
未在WHERE
子句。将索引重新定义为
ALTER TABLE `users`
ADD PRIMARY KEY (`user_id`),
ADD KEY ix_status_istatus (user_status, influencer_status);
允许使用它,并且应该加快查询速度,将用户
上的搜索更改为使用索引
而不是临时和文件排序
。
更新
对 dbfiddle 的进一步分析表明,最好从 P
表中删除 FORCE INDEX
,因为它没有必要(仅 PRIMARY
code> 键是必需的)并将 JOIN
更改为 STRAIGHT_JOIN
即,将 JOIN
写为:
FROM user_posts P
STRAIGHT_JOIN users U FORCE INDEX (ix_status_istatus)
ON P.user_id_fk = U.user_id
关于mysql - 查询运行太慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58058957/