mysql - 如何使用mysql的EXPLAIN查找可能存在的问题

标签 mysql explain

对网站进行压力测试,显然一切都崩溃了。

今天的问题:几个页面上的 WSOD。几个小时后,我将一个页面上的问题缩小到这个查询(我希望):它曾经在一秒钟内运行;现在需要 > 300。

SELECT   jobs.posting_date                          ,
         jobs.id                                    ,
         jobs.title                                 ,
         addresses.street                           ,
         cities.name                                ,
         states.abbr                                ,
         details.target_url                         ,
         details.description_extracted AS extraction,
         COUNT(jobs_skills.skill_id)   AS skills    ,
         users.first_name
FROM     jobs
         JOIN addresses
         ON       addresses.id = jobs.address_id
         JOIN states
         ON       addresses.state_id = states.id
         JOIN cities
         ON       addresses.city_id = cities.id
         JOIN job_feed_details AS details
         ON       jobs.id = details.job_id
         LEFT JOIN jobs_skills
         ON       jobs.id = jobs_skills.job_id
         LEFT JOIN users
         ON       users.id = details.user_id
WHERE    details.moderated = 0
AND      expiration        = 0
GROUP BY jobs.id
ORDER BY jobs.posting_date DESC

运行 EXPLAIN 我明白了:

id  select_type table   type    possible keys           key  key_len    ref                     rows    extra
1   SIMPLE  details ALL job_id                                      537704                              Using where; Using temporary; Using filesort
1   SIMPLE  jobs        eq_ref  PRIMARY,address_id_indexPRIMARY 4   557574_dev.details.job_id       1   Using where
1   SIMPLE  addresses   eq_ref  PRIMARY             PRIMARY     4   557574_dev.jobs.address_id      1   Using where
1   SIMPLE  states      eq_ref  PRIMARY             PRIMARY     1   557574_dev.addresses.state_id   1   Using where
1   SIMPLE  cities      eq_ref  PRIMARY             PRIMARY     4   557574_dev.addresses.city_id    1   
1   SIMPLE  jobs_skills ref     Job_skill           Job_skill   4   557574_dev.jobs.id              4   Using index
1   SIMPLE  users       eq_ref  PRIMARY             PRIMARY     3   557574_dev.details.user_id      1   

看看 EXPLAIN 是否有可能告诉我们

  • 如果发生任何全表扫描
  • 如果有任何相关切口缺失
  • 哪个表或连接这么慢
  • 我“寻找慢表”的任何其他有用信息

更新:在没有 group_by(和相关表连接)的情况下再次运行查询;仍然需要一个临时表和文件排序,所以它似乎是一个索引问题。将开始查看所有表以查找缺失的索引。

最佳答案

您定义了哪些指标?

如果索引 jobs.address_id、addresses.state_id、addresses.city_id、details.job_id、jobs_skills.job_id、details.user_id 和 jobs.posting_date,您应该能够从索引执行整个连接,而不会触及基础表并使用索引运行排序。

此外,职位是否按 posting_date 顺序插入?如果是这样,您可以按 id 而不是按 posting_date 进行排序,因为它是主键,所以速度会更快。

解释计划看起来大部分处理都在分组和排序中。您在最后一步有一个文件排序和临时表,这是非常昂贵的。此外,看起来您在可能应该使用索引的地方使用了 where,因此您可能希望确保所有关联列都已编入索引。

我建议在您的沙箱中加载数据并使用索引组合,直到您的解释计划使用更多索引并且希望没有临时表或文件排序。尽管分组往往很昂贵,但最后一部分可能会有些困难。

这有帮助吗?

关于mysql - 如何使用mysql的EXPLAIN查找可能存在的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5901936/

相关文章:

mysql - 索引 MySQL 查询使用 1 比使用 0 执行得更好

mysql - JOIN 以奇怪的顺序完成;搞乱 ORDER BY?

MySQL:在这种简单的情况下,何时应用 where 条件检查和文件排序操作?

mysql - mysql 是否可以在一个查询中执行多个解释?

php - 从 10 多个表中选择 (mysql)

mysql - "SELECT * FROM view_table WHERE cause"=> 但结果总是重新排序

mysql - 创建或更新 Sequelize

MySQL EXPLAIN 行数在简单的 WHERE 条件下要高得多

mysql - 无法存储我在存储过程中输出的值

mysql - 在 SQL 中按范围分组