mysql - 查询运行太慢

标签 mysql sql

给出名为“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);

允许使用它,并且应该加快查询速度,将用户上的搜索更改为使用索引而不是临时和文件排序

Demo on dbfiddle

更新

对 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/

相关文章:

sql - 查找 GDP 大于一组国家的国家

php - 向mysql插入数据不起作用

php-mysql 版本与 Mysql 服务器冲突

php - 显示通过单击按钮登录的用户名

mysql - 如何在 MySQL 的 utf-8 列中识别语言

mysql - SQL查询中如何在两列之间进行除法

mysql - MySql建表出错 : check the manual that corresponds to your MySQL server version for the right syntax to use near ')'

mysql - 未知的内部查询错误

sql - 比递归 cte 执行更好的查询

sql - 按范围分组 SQL Server