[英]Improving MySQL read time, MySQLdb
我有一个表格,其中有超过一百万条记录,其结构如下:
mysql> SELECT * FROM Measurement;
+----------------+---------+-----------------+------+------+
| Time_stamp | Channel | SSID | CQI | SNR |
+----------------+---------+-----------------+------+------+
| 03_14_14_30_14 | 7 | open | 40 | -70 |
| 03_14_14_30_14 | 7 | roam | 31 | -79 |
| 03_14_14_30_14 | 8 | open2 | 28 | -82 |
| 03_14_14_30_15 | 8 | roam2 | 29 | -81 |....
我正在从这张表中读取数据到python中进行绘图。 问题是,MySQL的读取速度太慢,即使使用MySQLdb.cursors.SSCursor(如本论坛中的一些人所建议的那样)来加快任务速度,我也要花费数小时才能获得图表。
con = mdb.connect('localhost', 'testuser', 'conti', 'My_Freqs', cursorclass = MySQLdb.cursors.SSCursor);
cursor=con.cursor()
cursor.execute("Select Time_stamp FROM Measurement")
for row in cursor:
... Do processing ....
标准化表格会帮助我加快任务速度吗? 如果是这样,我应该如何规范它?
PS:这是EXPLAIN的结果
+------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+-------+
| Time_stamp | varchar(128) | YES | | NULL | |
| Channel | int(11) | YES | | NULL | |
| SSID | varchar(128) | YES | | NULL | |
| CQI | int(11) | YES | | NULL | |
| SNR | float | YES | | NULL | |
+------------+--------------+------+-----+---------+-------+
问题可能出在您遍历游标而不是一次转储所有数据然后对其进行处理。 您应该能够在几/几秒钟内转出几百万行。 尝试做类似的事情
cursor.execute("select Time_stamp FROM Measurement")
data = cusror.fetchall()
for row in data:
#do some stuff...
好吧,既然你说整个表已被阅读,我想你不能做这件事。 它有超过一百万条记录...您不会在数据库方面进行太多优化。
仅处理一条记录需要多少时间? 也许您可以尝试优化该部分。 但是,即使您将每条记录的时间降低到了1毫秒,处理整个表仍将花费大约半小时。 您正在处理大量数据。
也许并行运行多个绘图作业? 使用与上述相同的指标,将您的数据划分为6个相同大小的作业(理论上)将在5分钟内为您提供绘图。
您的地块必须细粒度吗? 您可以寻找忽略数据中某些值的方法,并仅在用户需要时才生成完整的图(在这里很容易猜测,我真的不知道您的图是什么样子)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.