改进MySQL读取时间,MySQLdb

时间:2013-03-18 15:29:58

标签: python mysql database-normalization

我有一个包含超过一百万条记录的表,其结构如下:

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 ....

规范表会帮助我加快任务吗?如果是这样,我应该如何规范呢?

P.S:这是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    |       |
+------------+--------------+------+-----+---------+-------+

2 个答案:

答案 0 :(得分:0)

问题可能是你在光标上循环而不是只是一次性地转出所有数据然后处理它。你应该能够在几秒/几秒内抛出几百万行。尝试做类似

的事情
cursor.execute("select Time_stamp FROM Measurement")
data = cusror.fetchall()
for row in data: 
   #do some stuff...

答案 1 :(得分:0)

好吧,既然你说整个已经被阅读了,我想你不能做太多。它有超过100万条记录......你不会在数据库方面进行太多优化。

您只需要多长时间处理一条记录?也许您可以尝试优化该部分。但即使你的每条记录下降到1毫秒,处理整个表仍然需要大约半个小时。你正在处理大量数据。

也许并行运行多个绘图工作?使用与上述相同的指标,将您的数据划分为6个相等大小的作业(理论上)将在5分钟内为您提供图表。

你的情节必须细粒度吗?您可以寻找忽略数据中某些值的方法,并仅在用户需要时生成完整的图(在这里疯狂猜测,我真的不知道你的情节是什么样的)