【问题标题】:Mysql query is too slow when order by datetime按日期时间排序时,mysql查询太慢
【发布时间】:2017-10-16 08:37:23
【问题描述】:

我有一个大约 10k 行的表。我在 sql 下运行,但时间太长(~4 秒):

SELECT
        ID, post_date, post_title, post_name, pc.post_view,
        t.name AS post_category,
        pm2.meta_value AS post_image
    FROM wp_posts p
        INNER JOIN wp_term_relationships tr ON p.ID = tr.object_id
        INNER JOIN wp_term_taxonomy tt ON tr.term_taxonomy_id = tt.term_taxonomy_id AND tt.taxonomy='category'
        INNER JOIN wp_terms t ON tt.term_id = t.term_id AND (t.name='My Posts' OR t.name='HOT posts')
        LEFT JOIN post_counter pc ON p.ID = pc.post_id
        LEFT JOIN wp_postmeta pm ON pm.post_id = p.ID AND pm.meta_key = '_thumbnail_id'
        LEFT JOIN wp_postmeta pm2 ON pm.meta_value = pm2.post_id AND pm2.meta_key = '_wp_attached_file'
    WHERE p.post_status = 'publish' AND p.post_type = 'post'
    ORDER BY FIELD(t.name, 'HOT posts', 'My Posts'), post_date DESC
    LIMIT 14

如果我删除“按 post_date 订购”,一切都很好。运行只需 0.05 秒。

我用 CREATE INDEX 和 ADD INDEX 添加了一些索引(我不知道它们之间有什么区别):

CREATE INDEX ix_type_date ON wp_posts (post_type, post_date)

ALTER TABLE wp_posts ADD INDEX ix_status_type_date (post_status,post_type,post_date)

然后将这些索引与 USE INDEX 和 FORCE INDEX 一起使用(我也不知道它们之间有什么区别):

    ...FROM wp_posts p USE INDEX (ix_type_date)...

    ...FROM wp_posts p FORCE INDEX (ix_status_type_date)...

我仍然可以获取我的记录,但加载时间增加到 7-8 秒。

表格的结构

ID  bigint(20)  No           
post_author bigint(20)  No  0        
post_date   datetime    No  0000-00-00 00:00:00          
post_date_gmt   datetime    No  0000-00-00 00:00:00          
post_content    longtext    No           
post_title  text    No           
post_excerpt    text    No           
post_status varchar(20) No  publish          
comment_status  varchar(20) No  open         
ping_status varchar(20) No  open         
post_password   varchar(255)    No           
post_name   varchar(200)    No           
to_ping text    No           
pinged  text    No           
post_modified   datetime    No  0000-00-00 00:00:00          
post_modified_gmt   datetime    No  0000-00-00 00:00:00          
post_content_filtered   longtext    No           
post_parent bigint(20)  No  0        
guid    varchar(255)    No           
menu_order  int(11) No  0        
post_type   varchar(20) No  post         
post_mime_type  varchar(100)    No           
comment_count   bigint(20)  No  0 

【问题讨论】:

  • 你可以在这里发布带有索引的表结构吗?
  • 你可以尝试在wp_terms.namepost_date 上放置一个复合索引吗?
  • 为所有相关表提供SHOW CREATE TABLE 语句,以及EXPLAIN 的结果。
  • @TimBiegeleisen:对不起,我还是个新手。我不知道如何从两个表中创建索引。能不能说的清楚一点?
  • @phong 我认为首先您应该将日期字段的默认值设置为空,这很重要,它可能会影响性能

标签: mysql datetime indexing


【解决方案1】:

您想要“热门帖子”,然后是“我的帖子”?而且有可能少于14个Hotties,还有很多“我的帖子”?

一个笨拙的解决方案是

( SELECT ... name='HOT posts' ORDER BY post_date DESC  LIMIT 14 )
UNION ALL
( SELECT ... name='My Posts'  ORDER BY post_date DESC  LIMIT 14 )
ORDER BY field(...), post_date DESC  LIMIT 14

请注意,有可能快速找到每个类别的最新 14 个,然后快速重新排列 28 个以获得所需的 14 个。

对于多对多表,请参阅here 了解如何提高其性能。 (默认的 WP 效率相当低。)

如需进一步讨论,请提供EXPLAIN SELECT ...SHOW CREATE TABLE

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-15
    • 2015-09-12
    • 1970-01-01
    • 1970-01-01
    • 2012-12-03
    • 2013-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多