gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 08:37:46 25 4
gpt4 key购买 nike

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

今天的问题:几个页面上的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com