Python 提高MySQL读取时间

Python 提高MySQL读取时间,python,mysql,database-normalization,Python,Mysql,Database Normalization,我有一个记录超过一百万条的表,其结构如下: mysql> SELECT * FROM Measurement; +----------------+---------+-----------------+------+------+ | Time_stamp | Channel | SSID | CQI | SNR | +----------------+---------+-----------------+------+------+ | 03_14_

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

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的读取速度太慢,即使在使用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 ....
规范化表格是否有助于我加快任务?如果是,我应该如何使其正常化

附言:这是解释的结果

+------------+--------------+------+-----+---------+-------+
| 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分钟内绘制出图


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

您真的需要阅读整个表格才能生成绘图吗?您不能至少使用WHERE子句来获取必要的数据吗?我使用WHERE子句来获取单独绘图的特定数据。但整个表格都将被读取。谢谢..运行您的查询,然后在这里发布结果,如果问题确实在MySQL方面。@Burnkhalid:我已经发布了解释的结果。谢谢..@BurhanKhalid:问题在于MySQL端,因为我正在打印此查询开始和结束的时间。上图还显示MySQL使用了100%的CPU。绘图不会占用那么多时间。因此,并行绘图可能不会节省大量时间。如果你是说MySQL并行读取,我可以试试。忽略值至少目前不是一个选项:光标一次转储所有数据。但是我必须在每个时间戳期间获得可用的通道。因此,我将执行类似于从测量中选择通道的操作,其中每个时间戳的循环中的时间戳='%s'。这不是正确的方法。这就是经济放缓的原因。如果您先进行一次总转储,然后用Python进行处理,这将比再次对数据库中的每一行执行新的sql选择要快得多。此外,“for row in cursor”与data=cursor不同。fetchall我相信您的方法是对每一行执行sql调用,如果执行FetchAll,则不必只对整个数据集执行一个sql调用,还可以使用sql或python中的GROUPBY来执行此操作。