为什么我的select查询这么慢?

环境:mysql 5.7.18

clipboard.png

如图所示,我的表结构只有四个字段,DDL如下:

CREATE TABLE `rn_data20170316` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `traffictype` varchar(10) DEFAULT NULL,
  `lng` double DEFAULT NULL,
  `lat` double DEFAULT NULL,
  `instationnum` int(10) DEFAULT NULL,
  `outstationnum` int(10) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=983026 DEFAULT CHARSET=utf8

该表一共 975960 条数据,
在mysql cmd中执行 'select * from table' 返回结果 1.34秒

clipboard.png

但是当我在pymysql中使用同样的语句

cursor.execute("select * from table ;")

返回结果时间竟然长达14秒!!!!

这应该已经是最简单的sql语句了,为什么这么慢?

阅读 8.9k
8 个回答

你的时间应该大部分都消耗在了传输上,一次性取出这么多数据也是不明智的,sql语句并不是越简单越快,是检索的数据越少才越快,注意检索的数据和取出的数据概念是不一样的

因为你一次性加载了所有数据,这么大的数据量传输肯定很耗时啊,加上分页吧,select * from table limit 10

在97W的数据集中怎么会有扫全表的业务需求呢?不合理~

有传输的耗时啊,而且还需要转化为py的数据,慢在pymysql更有可能一些,要看这一部分代码怎么写的了

这个锅大概不应该让MySQL背吧。可能数据早收到了,但是格式化显示花了很多时间。

网络IO 磁盘IO

新手上路,请多包涵

尽量别用select *吧。。需要哪列返回哪列,节约数据传输量和内存从我做起。。

python的没用过,说一说我在php那边的做法,可能有点价值。

第一步通常是优化你这一条sql语句,像这种select *和不加限制条件的查询,在经理那关就不通过了,通过不会又这种需求,就算有也是能够转换成其他sql的。这里之所以慢,是因为mysql服务需要一次性将结果集传给客户端。因此关键路径在传输上。

第二步一定需要使用这条语句,那么就使用unbuffered的查询。通常为了让数据库尽快能够完成查询,释放资源,查询会一次性传输全部的结果。这样的话,对于你这种需求就不是那么有利了。在php中有一个mysql_unbuffered_query的函数(python中应该有),能够边处理边传输(如同生成器一般),如果还有需求还可以处理完直接刷新缓存到前端,这样能让用户感觉不到假死。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题