2013-03-21 2 views
4

У меня есть таблица с 2 миллионами регистров, но она будет расти гораздо быстрее. В основном эта таблица содержит точки интереса изображения с соответствующими дескрипторами. Когда я пытаюсь выполнить запрос, который выбирает точки, расположенные в пространстве рядом с точками запроса, общее время выполнения занимает слишком много времени. Точнее Duration/Fetch = 0.484 sec/27.441 sec. И запрос довольно прост, который возвращает только ~ 17000 строк.Оптимизация времени выборки MySQL

Мой запрос:

SELECT fp.fingerprint_id, fp.coord_x, fp.coord_y, fp.angle, 
fp.desc1, fp.desc2, fp.desc3, fp.desc4, fp.desc5, fp.desc6, fp.desc7, fp.desc8, fp.desc9, fp.desc10, 
fp.desc11, fp.desc12, fp.desc13, fp.desc14, fp.desc15, fp.desc16, fp.desc17, fp.desc18, fp.desc19, 
fp.desc20, fp.desc21, fp.desc22, fp.desc23, fp.desc24, fp.desc25, fp.desc26, fp.desc27, fp.desc28, 
fp.desc29, fp.desc30, fp.desc31, fp.desc32 
FROM fingerprint fp 
WHERE 
fp.is_strong_point = 1 AND 
(coord_x BETWEEN 193-40 AND 193+40) AND (coord_y BETWEEN 49-15 AND 49+15) 
LIMIT 1,1000000; 

Это то, что я сделал.

  1. Я попытался изменить key_buffer_size в my.ini, но не видел много изменений.
  2. Кроме того, я попытался установить coord_x и coord_y в качестве индексов, но время запроса стало медленнее.
  3. Таблица разделена диапазоном поля coord_x, что дало мне лучшие результаты.

Как я могу уменьшить время выборки? Можно ли уменьшить его до миллисекунды?

ответ

0

Если я прав, запрос выполняется очень быстро, но медленное - это выборка данных из вашей базы данных. Загрузка данных 170000 из хранилища занимает 27 секунд.

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

Для максимальной скорости вы можете использовать двигатель MEMORY. Единственный недостаток заключается в том, что вам придется хранить копию этой таблицы в другом движке, если вам придется делать динамические изменения, и после любых изменений вам придется перезагрузить различия или всю таблицу.

Также вы должны сделать скрипт, который запускается при перезагрузке сервера, так что ваша таблица памяти будет загружена при запуске вашего сервера MySQL

See here for the doc

+0

Я знаю, что в Oracle это должно быть быстрее, но я должен использовать MySQL в этом проекте. Я думал, что в конфигурациях MySQL могут быть некоторые трюки? Спасибо за Ваш ответ. – andriy

+0

@Andriy Я надеюсь, что вы также знаете, что MySQL может также использовать более одного модуля DB. MyISAM и innodb, например ... – ITroubs

+0

@Andriy, если вы используете такой инструмент, как phpmyadmin, тогда вы сможете увидеть, какой механизм базы данных использует ваша таблица. – ITroubs

8

я столкнулся медленно выборки вопрос слишком (MySQL , InnoDB). Наконец, я обнаружил, что innodb_buffer_pool_size по умолчанию для 8MB для моей системы, которого недостаточно для обработки запроса. После увеличения его производительности 1GB кажется прекрасным:

    Duration/Fetch 
353 row(s) returned 34.422 sec/125.797 sec (8MB innodb buffer) 
353 row(s) returned 0.500 sec/1.297 sec (1GB innodb buffer) 

UPDATE:

Чтобы изменить innodb_buffer_pool_size добавить к вашей my.cnf

innodb_buffer_pool_size=1G 

перезагрузить MySQL, чтобы сделать его эффект

Справка: How to change value for innodb_buffer_pool_size in MySQL on Mac OS?

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