暂无图片
如何优化这个SQL呢 MySQL
我来答
分享
Switchblade
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
打赏 0
暂无图片
Switchblade
题主
2023-12-10
谢回复,这里wp_posts.ID是主键,但是去掉group by,会导致返回的结果集不一致,wp_term_relationships有一个联合主键(object_id,term_taxonomy_id),其中有一组数据数集是(1930747,613)和(1930747,645),去掉group by,返回的ID就有两个1930747,
Switchblade
题主
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
打赏 0
Switchblade
题主
2023-12-08
语法错误SELECT term_taxonomy_id FROM (VALUES (118), (124), (127), (...), (145483)) AS t(term_taxonomy_id),这个写法是?
chengang

数据库版本是好多呢?

暂无图片 评论
暂无图片 有用 0
打赏 0
Switchblade
mariadb 10.11
暂无图片 评论
暂无图片 有用 1
打赏 0
chengang

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

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

有没有开MRR 呢?

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

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

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

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

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

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

索引原则esro

equal  sort range  other

暂无图片 评论
暂无图片 有用 0
打赏 0
回答交流
Markdown


请输入正文
提交
相关推荐
mysql 远程连接时 ERROR 1043: Bad handshake,怎么排查处理?
回答 1
已采纳
可能与SSL有关。1)mysql是否启用了ssl,showvariableslike'%ssl%';2)应用端的jdbc配置,是否有useSSLfalse配置项。
各位大神,我这里有两个sql查询结果一样,区别就是添加了一层rownum别名,就快了百倍,哪位能解释下原理啊?不太明白
回答 2
是不一样的,加上rownum,直接使用filter,不会查全表;你不加的话,realnum1会先查全表,取出一行;你看看执行计划,应该是不一样的。
oracle中的热块争抢问题,其他pg,mysql,db2中是否有类似的情况?
回答 1
肯定都有的,比如mysql中是页,每次读写都是以页为单位,如果对多条在同一个页都有并发修改,就会有这种情况。
8.0的物理备份要下载pxb glibc 2.17 还是2.12 ?
回答 1
glibc是和OS有关,和数据库关系不大.glibc是向下兼容的,但建议和os一致.可以使用如下命令查看os的glibc版本getconfGNULIBCVERSION嫌麻烦的话,直接低版本的2.12即
为啥设置change master to master auto position =1,从库的gtid executed 会被重置?
回答 1
搭建主从之后主节点不应该再重置这个参数了吧?
mysql有没有错误代码清单?
回答 2
已采纳
0101属于其他进程的专用标志。0102标志已经设置,无法关闭。0103无法再次设置该标志。0104中断时无法请求专用标志。0105此标志先前的所有权已终止。0106请将软盘插入驱动器%1。0107后
怎么样查看MySQL卸载干净?
回答 1
已采纳
rpme XXXXXX nodeps所有的mysql (rpmqa|grepmysql)然后删除数据目录
求一份mysql dba运维脚本,类似oracle dba 使用 ora脚本或者 percona-toolkit 工具查看主从延时,kill等功能
回答 2
MYSQL官方的mysqlutiles工具集就不错,但是是使用python2编写的.(yum也是使用python2写的,所以不用担心没得python2).下载地址:https://downloads.
show relaylog events in '';语里面句被#注释什么意思
回答 2
如果是报主键冲突,可以用在my.cnf里添加slaveskiperrors参数,过滤掉主键冲突的错误,或者将slave中冲突的记录删除即可
MySQL数据库升级前后怎么检验数据是否一致?
回答 1
checksumtablename