2017-10-16 119 views
1

我有一个约10k行的表。我运行下面的SQL,但它花费太多时间(约4秒):当按日期排序时,Mysql查询速度太慢

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)... 

OR

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

我仍然得到我的录音功ds,但加载时间增加到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 
+0

你能发表表格结构吗? –

+0

你可以尝试在'wp_terms.name'和'post_date'上放置一个复合索引吗? –

+0

为所有相关表格提供'SHOW CREATE TABLE'语句,以及'EXPLAIN'的结果。 – Strawberry

回答

-2

https://www.sqlservercentral.com/Forums/Topic727934-360-1.aspx

请参考此链接。这将帮助你解决这个问题。

+0

OP使用的是MySQL,而不是SQL Server。这应该是一个评论。 –

+0

谢谢,但我无法打开该链接。它在2分钟后仍在加载。你能告诉我一些想法吗? –

0

你想先“热门帖子”,然后“我的帖子”?而且有可能少于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