如何在MySQL中优化这个令人困惑的慢查询?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了如何在MySQL中优化这个令人困惑的慢查询?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2667字,纯文字阅读大概需要4分钟。
内容图文
我有一个博客文章表,每个都有一个外键回到它的作者.有<此表中有15,000个条目.此查询扫描超过19,000行(每个EXPLAIN),需要一个filesort(可能是常规的MySQL行为),并需要超过400毫秒才能返回5行.可能是因为用于检查项目是否实际发布的复杂WHERE.
最亲爱的Stack Overflow,我如何能够控制这个查询?
注意:虽然此标准可能需要简化,但所有条件都是必需的.
SELECT `blog_post.id`,
`blog_post.title`,
`blog_post.author_id`,
`blog_post.has_been_fact_checked`,
`blog_post.published_date`,
`blog_post.ordering`,
`auth_user.username`,
`auth_user.email`
FROM `blog_post`
INNER JOIN `auth_user`
ON (`blog_post`.`author_id` = `auth_user`.`id`)
WHERE (`blog_post`.`is_approved` = True AND
`blog_post`.`has_been_fact_checked` = True AND
`blog_post`.`published_date` IS NOT NULL AND
`blog_post`.`published_date` <= '2010-10-25 22:40:05' )
ORDER BY `blog_post`.`published_date` DESC,
`blog_post`.`ordering` ASC,
`blog_post`.`id` DESC
LIMIT 5
除了PK,我在表上有以下索引:
idx_published_blog_post -> blog_post(is_approved, has_been_fact_checked, published_date)
idx_pub_date -> blog_post(published_date)
EXPLAIN的输出如下所示:
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: blog_post
type: ref
possible_keys: blog_post_author_id,idx_published_blog_post,idx_pub_date
key: idx_published_blog_post
key_len: 4
ref: const,const
rows: 19856
Extra: Using where; Using filesort
*************************** 2. row ***************************
id: 1
select_type: SIMPLE
table: auth_user
type: eq_ref
possible_keys: PRIMARY
key: PRIMARY
key_len: 4
ref: blog.blog_post.author_id
rows: 1
Extra: Using index
2 rows in set (0.00 sec)
附注:2010-10-25 22:40:05只是执行此查询的代码生成的日期.
非常感谢任何&所有的帮助!
解决方法:
MySQL不支持索引中的ASC / DESC子句.
您需要创建一个名为reverse_ordering的单独列,并将其值设置为-ordering(假设排序是一个数值)
然后,您可以创建以下索引:
CREATE INDEX ix_blogpost_a_c_p_ro_id ON blog_post (is_approved, has_been_fact_checked, published_date, reverse_ordering, id)
并重写您的查询:
SELECT `blog_post.id`,
`blog_post.title`,
`blog_post.author_id`,
`blog_post.has_been_fact_checked`,
`blog_post.published_date`,
`blog_post.ordering`,
`auth_user.username`,
`auth_user.email`
FROM `blog_post`
INNER JOIN `auth_user`
ON `blog_post`.`author_id` = `auth_user`.`id`
WHERE `blog_post`.`is_approved` = 1 AND
`blog_post`.`has_been_fact_checked` = 1 AND
`blog_post`.`published_date` <= '2010-10-25 22:40:05'
ORDER BY `blog_post`.`published_date` DESC,
`blog_post`.`reverse_ordering` DESC,
`blog_post`.`id` DESC
LIMIT 5
您可以摆脱IS NULL检查,因为不等式条件意味着它.
更新:
您可能还想阅读这篇文章:
> Mixed ASC/DESC sorting in MySQL
内容总结
以上是互联网集市为您收集整理的如何在MySQL中优化这个令人困惑的慢查询?全部内容,希望文章能够帮你解决如何在MySQL中优化这个令人困惑的慢查询?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。