2013-03-18 2 views
1

У меня есть таблица с более миллиона записей со следующей структурой:Улучшение MySQL время чтения, 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 |.... 

Я читал данные из этой таблицы в питоне для черчения. Проблема в том, что чтение в 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 |  | 
+------------+--------------+------+-----+---------+-------+ 
+1

Действительно ли вы должны прочитать целая таблица для создания ваших участков? Не могли бы вы использовать хотя бы условие WHERE для получения только необходимых данных? –

+0

Я использую предложение WHERE для получения конкретных данных для отдельных графиков. Но вся таблица будет прочитана. спасибо .. –

+0

Запустите ['EXPLAIN'] (http://dev.mysql.com/doc/refman/5.0/en/explain.html) по вашему запросу, а затем опубликуйте результаты здесь (если действительно проблема на MySQL). –

ответ

0

Проблема, вероятно, что вы цикл над курсором вместо просто демпинг все данные сразу, а затем обработать его. Вы должны иметь возможность сбросить пару миллионов строк за пару секунд. Попробуйте сделать что-то вроде

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

Курсор сбрасывает все данные за один раз. Но я должен получить каналы в течение каждой отметки времени. Поэтому я буду выполнять что-то вроде «Выбрать канал FROM Measurement WHERE Time_stamp = '% s» в цикле для каждой метки времени. –

+0

Это не правильный путь. Именно здесь происходит замедление.Это будет намного быстрее, если вы сделаете общий дамп, а затем обработаете на Python, чем новый новый sql-выбор для каждой строки в базе данных. – reptilicus

+0

также «для строки в курсоре» - это не то же самое, что data = cursor.fetchall() – reptilicus

0

Ну, так как вы говорите, стол весьимеет для чтения, я думаю, вы не можете сделать много о нем. У него более 1 миллиона записей ... вы не собираетесь оптимизировать многое на стороне базы данных.

Сколько времени требуется, чтобы обработать только одну запись? Возможно, вы могли бы попытаться оптимизировать эту часть. Но даже если вы заработали до 1 миллисекунды за запись, вам все равно потребуется около получаса, чтобы обработать полный стол. Вы имеете дело с большим количеством данных.

Возможно параллельное выполнение нескольких заданий на печать? С теми же показателями, что и выше, деление ваших данных на 6 рабочих мест равного размера (теоретически) даст вам графики за 5 минут.

Ваши земельные участки должны быть мелкозернистыми? Вы можете искать способы игнорировать определенные значения в данных и генерировать полный график только тогда, когда пользователю это нужно (дикие предположения здесь, я действительно не знаю, как выглядят ваши сюжеты)

+0

Построение не занимает столько времени. Таким образом, построение графика параллельно не может сэкономить много времени. Если вы имеете в виду, что MySQL читает параллельно, я могу попробовать это. Игнорирование значений пока не является опцией по крайней мере :) –

Смежные вопросы