gpt4 book ai didi

MySql 同一查询的不同执行路径

转载 作者:太空宇宙 更新时间:2023-11-04 09:40:42 25 4
gpt4 key购买 nike

我有两台服务器(linode 3072 vps),一台(较旧的)有 ubuntu 11.04 + Mysql 5.5.32,另一台(较新的)有 centos 6.2。 + Mysql 5.5.36。 My.cnf 文件也是一样的。但是,当我在同一个数据库(直接导出/导入)上运行相同的查询时,我从 2 个服务器获得了 2 个不同的响应时间和执行路径。

年龄越大 react 越快。

1   SIMPLE  ch  ref PRIMARY,channel_name    channel_name    122 const   1   Using where; Using temporary; Using filesort
1 SIMPLE t ref PRIMARY,channel_id channel_id 4 bcc.ch.channel_id 1554
1 SIMPLE p ref PRIMARY PRIMARY 4 bcc.t.entry_id 1 Using index
1 SIMPLE c eq_ref PRIMARY,group_id PRIMARY 4 bcc.p.cat_id 1 Using where

响应较慢的新版本。

1   SIMPLE  ch  ref PRIMARY,channel_name    channel_name    122 const   1   Using where; Using temporary; Using filesort
1 SIMPLE p index PRIMARY PRIMARY 8 NULL 25385 Using index; Using join buffer
1 SIMPLE t eq_ref PRIMARY,channel_id PRIMARY 4 bcc.p.entry_id 1 Using where
1 SIMPLE c eq_ref PRIMARY,group_id PRIMARY 4 bcc.p.cat_id 1 Using where

最大的区别在于第二步。第一个服务器使用索引,只需要扫描 1554 行,而第二个服务器使用索引 + 连接缓冲区,必须扫描 25385 行。有什么想法吗?

像这样的查询和其他查询会导致新服务器上某些页面的每页加载时间增加几秒。我正在使用清漆来为前端提供服务,但仍想解决此问题。

这是正在运行的sql

select SQL_NO_CACHE cat_name,cat_url_title, count(p.entry_id) as count
from exp_categories as c
join exp_category_posts as p on c.cat_id = p.cat_id
join exp_channel_titles as t on t.entry_id = p.entry_id
join exp_channels as ch on ch.channel_id = t.channel_id
where channel_name IN ('resources')
AND group_id = 2
group by cat_name
order by count desc
limit 5

最佳答案

MySQL 中的查询优化器根据索引和表的统计信息选择要使用的索引。有时索引的选择不是最优的,查询执行也不同。

我们在我们的数据库中发现,在一天中的某些时间点,MySQL 会更改它用于同一查询的执行路径。

你可以试试

analyze table exp_categories,exp_category_posts,exp_channel_titles,exp_channels ;

这有时会改进执行计划。或者使用索引提示来确定使用了哪些索引。

关于MySql 同一查询的不同执行路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21942742/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com