【发布时间】: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.name和post_date上放置一个复合索引吗? -
为所有相关表提供
SHOW CREATE TABLE语句,以及EXPLAIN的结果。 -
@TimBiegeleisen:对不起,我还是个新手。我不知道如何从两个表中创建索引。能不能说的清楚一点?
-
@phong 我认为首先您应该将日期字段的默认值设置为空,这很重要,它可能会影响性能