暂无图片
如何优化这个SQL呢 MySQL
我来答
分享
Awesome Database
2023-12-08
如何优化这个SQL呢 MySQL
暂无图片 10M

SELECT wp_posts.ID
FROM wp_posts JOIN wp_term_relationships ON wp_posts.ID = wp_term_relationships.object_id
WHERE
wp_term_relationships.term_taxonomy_id IN (118,124,127,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,906,912,913,914,915,917,918,919,920,921,923,926,927,928,929,932,933,935,937,938,939,972,974,975,976,979,980,981,983,984,986,987,988,989,991,992,993,994,997,998,999,1000,1001,1002,1003,1006,1008,1009,1010,1011,1014,1017,1018,1019,1023,1024,1026,1030,1032,1033,1297,1304,1319,1324,1325,1327,1331,1333,1335,1336,1338,1339,1340,1341,1348,1413,1686,2037,2353,2355,3047,3643,4437,5056,6662,8952,10172,12533,12534,12536,12537,15245,15782,28583,31766,31778,31779,31783,31784,31785,31803,31804,31807,31808,31813,31814,31818,31820,31821,31822,31826,31845,34582,34583,34586,34587,34591,34595,34990,34991,34992,34993,34995,34998,34999,35000,35001,35002,35003,35004,35008,35009,35010,35011,35026,35027,35028,35029,35030,35032,35033,35035,35036,35037,35038,35039,50785,51893,52466,56645,59235,145481,145482,145483)
AND
wp_posts.post_type = 'post'
AND wp_posts.post_status in ('publish','acf-disabled')
GROUP BY wp_posts.ID
ORDER BY wp_posts.post_date DESC
LIMIT 0, 10;


执行计划

idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra
1SIMPLEwp_term_relationshipsrangePRIMARY,term_taxonomy_idterm_taxonomy_id8NULL74483Using where; Using index; Using temporary; Using filesort
1SIMPLEwp_postseq_refPRIMARY,type_status_date,idx_ps_pt_pdg,idx_pt_ps_pdd,idx_pt_pdd_psPRIMARY8bnnproddb.wp_term_relationships.object_id1Using where
我来答
添加附件
收藏
分享
问题补充
9条回答
默认
最新
广州_老虎刘

可以试试(post_type,post_date , post_status) 3字段联合索引; 同时把GROUP BY wp_posts.ID去掉(id字段应该是主键)

暂无图片 评论
暂无图片 有用 2
暂无图片
Awesome Database
题主
2023-12-10
谢回复,这里wp_posts.ID是主键,但是去掉group by,会导致返回的结果集不一致,wp_term_relationships有一个联合主键(object_id,term_taxonomy_id),其中有一组数据数集是(1930747,613)和(1930747,645),去掉group by,返回的ID就有两个1930747,
Awesome Database
题主
2023-12-10
谢大佬,给了思路,已经解决了,把去重的操作给wp_term_relationships来完成,直接7ms完成。原来是3.1秒
Mjwlan

这样吗:

SELECT wp_posts.ID
FROM wp_posts
JOIN wp_term_relationships ON wp_posts.ID = wp_term_relationships.object_id
WHERE wp_term_relationships.term_taxonomy_id IN (
SELECT term_taxonomy_id
FROM (VALUES (118), (124), (127), (...), (145483)) AS t(term_taxonomy_id)
)
AND wp_posts.post_type = 'post'
AND wp_posts.post_status IN ('publish', 'acf-disabled')
ORDER BY wp_posts.post_date DESC
LIMIT 0, 10;

暂无图片 评论
暂无图片 有用 4
Awesome Database
题主
2023-12-08
语法错误SELECT term_taxonomy_id FROM (VALUES (118), (124), (127), (...), (145483)) AS t(term_taxonomy_id),这个写法是?
chengang

数据库版本是好多呢?

暂无图片 评论
暂无图片 有用 0
Awesome Database
mariadb 10.11
暂无图片 评论
暂无图片 有用 1
chengang

可以尝试用exists或in改写一下。会少一个group by 就像1楼一样

暂无图片 评论
暂无图片 有用 0
Awesome Database
题主
2023-12-08
尝试了,没有用
chengang

有没有开MRR 呢?

74483 这个行数准吗?如果不准就是一个eq_range_index_dive_limit值小了。

暂无图片 评论
暂无图片 有用 1
Awesome Database
题主
2023-12-08
没有开MRR, eq_range_index_dive_limit默认是200.这里的值是超过了200
chengang
答主
2023-12-09
@DBA周技 那把这个值再改一些看计划
forever

wp_term_relationships这个表的索引是哪些字段呢

暂无图片 评论
暂无图片 有用 0
Awesome Database
题主
2023-12-08
二级索引term_taxonomy_id,主键(object_id,term_taxonomy_id)
forever

term_taxonomy_id,object_id 建一个两个字段的联合索引试试,减少wp_term_relationships表的返表

暂无图片 评论
暂无图片 有用 0
Awesome Database
题主
2023-12-09
试了,force这个联合索引,查询时间几乎不变
渔舟唱晚

索引原则esro

equal  sort range  other

暂无图片 评论
暂无图片 有用 0
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏