1

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

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    |       |
+------------+--------------+------+-----+---------+-------+
4

2 回答 2

0

问题可能是您正在循环游标,而不是一次转储所有数据然后处理它。您应该能够在几秒钟内转储几百万行。尝试做类似的事情

cursor.execute("select Time_stamp FROM Measurement")
data = cusror.fetchall()
for row in data: 
   #do some stuff...
于 2013-03-18T16:02:13.727 回答
0

好吧,既然您说必须阅读整个表格,我想您对此无能为力。它有超过 100 万条记录……您不会在数据库方面进行太多优化。

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

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

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

于 2013-03-18T16:08:03.450 回答