引出问题
一个很简单的sql,生产环境查询竟然要这么久
我本地只需要0.2s,测试环境也只需要不到1秒钟。
这差距也太大了。
执行的sql如下:
select date_day,detain_flag,reserve_flag,into_type,out_type,usable_flag from table where line_no='11' and date_day BETWEEN '2021-01'
nd '2022-02' and is_del=0 AND type=1 ;
前置说明:
其中 line_no、date_day 是加了联合索引的,类型都是varchar。
detain_flag,reserve_flag,into_type,out_type,usable_flag类型为int(1)和varchar(30)
目前是6台机器上有mysql集群。
表中有50万数据,符合条件是3万,表数据大小是160M。
对比
如果只执行
select date_day from table where line_no='11' and date_day BETWEEN '2021-01'
nd '2022-02';
是很快的。
但是执行
select date_day,detain_flag,reserve_flag,into_type,out_type,usable_flag from plan_train_use_schedule where line_no='11' and date_day BETWEEN '2021-05' and '2022-03';
后依然很慢,
差别就是返回的字段中多了几个。
然后又这样执行
select `code` from plan_train_use_schedule where line_no='13' and date_day BETWEEN '2021-05' and '2022-03' and is_del=0 AND type=1;
后依然很慢,
差别就是查询的条件中字段中多了几个。
我的猜想
我猜是因为回表导致的慢,但是这特娘的也太慢了吧,其他库有个600万数据的表,是很快的。我这个库有毒?
这两个命令能查出如下图的数据,需要先执行你的sql,然后下面的命令依次执行
show profiles;
show profile for query 26;
我现在怀疑是跟缓冲池大小有关,因为本地跟测试相对来讲没人用,所以默认的125M内存够用了,但是生产环境一直在用,所以发生回表操作的话需要把数据重新刷进去的,所以导致慢。但是需要重启mysql,暂且没试,查询的命令是:
show variables like ‘%query_cache%’;
show variables like ‘innodb_buffer_pool%’;
如图,Mysql的配置都是默认的。感觉有点坑爹。
我想改下试试。但是需要重启,不好操作。
分割线 2022年1月12日13:25:20
以下操作可能需要参考这篇文章:
win10查找Mysql5.6版本的配置文件my.ini并修改innodb_buffer_pool_size
虽然生产不好操作,但是我自己电脑可以操作哇。
我查了下自己电脑Mysql的配置
show variables like ‘innodb_buffer_pool%’;
结果为
innodb_buffer_pool_instances = 8
innodb_buffer_pool_size = 125M
此时查询速度很快的,0.2秒,配置为125M
然后我改了下,查询速度需要20+秒,配置为6M
然后我又改了下,变成2G,查询只要0.01秒,配置为2G
可以看到明显的差别。
只等去生产环境试一下看是否解决问题了。
完美解决,吼吼 2022年1月12日14:23:51
此时生产环境一台机器配置如下
执行sql查询时间为0.4秒,不吹牛逼,这特么的提升了100倍是有的
序1
2022年9月26日17:08:09
今天遇到的问题,使用navcat 查询很慢, 但是登录到服务器去执行同样的sql是正常的。怀疑是网络问题造成的。