• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

MySQL性能优化:按日期时间字段排序

MySql 海叔叔 2小时前 3次浏览 已收录 0个评论

我有一张大约有100000个博客文章的表格,通过1:n关系链接到一个有50个Feed的表格。当我用一个select语句查询这两个表时,由发布表的日期时间字段排序,MySQL总是使用filesort,导致查询时间非常慢(> 1秒)。以下是postings表(简化)的模式:

这是feed表:

以下是执行时间大于1秒的查询。请注意,post_date字段有一个索引,但是MySQL不使用它来对发布表进行排序:

这个查询的explain extended命令的结果显示MySQL正在使用filesort:

当我删除order by部分时,MySQL停止使用filesort。求帮忙,如果你有任何想法如何优化这个查询让MySQL排序和选择使用索引的数据。我已经尝试了一些东西,比如像在一些博客帖子中提到的那样,在所有的字段/字段上创建一个组合索引,但是这也不起作用。

最佳解决思路
在postings (is_active, post_date)上创建一个复合索引(按此顺序)。

它将用于is_active的过滤和post_date的排序。

MySQL应在EXPLAIN EXTENDED中显示REF访问方法。

请注意,通过user_offtopic_count您有一个RANGE过滤条件,这就是为什么您不能使用该字段的索引在过滤和其他字段进行排序。

根据user_offtopic_count的选择性(即多少行满足user_offtopic_count < 10)的不同,在user_offtopic_count上创建索引并对post_dates进行排序可能会更有用。 为此,请在postings (is_active, user_offtopic_count)上创建一个复合索引,并确保使用了通过此索引的RANGE访问方法。 哪个索引将更快取决于您的数据分布。创建两个索引,FORCE他们,看看哪个更快: CREATE INDEX ix_active_offtopic ON postings (is_active, user_offtopic_count); CREATE INDEX ix_active_date ON postings (is_active, post_date);


喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址