Производительность таблицы MySQL - PullRequest
1 голос
/ 29 марта 2012

У меня есть таблица, созданная следующим образом:

CREATE TABLE rh857_omf.picture(MeasNr TINYINT UNSIGNED, ExperimentNr TINYINT UNSIGNED,
Time INT, SequenceNr SMALLINT UNSIGNED, Picture MEDIUMBLOB, PRIMARY KEY(MeasNr, 
ExperimentNr, Time, SequenceNr));

Первые четыре строки MeasNR, ExperimentNr, Time и SequenceNr являются идентификаторами и задаются в качестве первичного ключа.Пятая строка, Picture, - это полезная нагрузка.Это изображение с серым значением 800x800 пикселей 8 бит (размер = 625 кБайт).

Если я хочу загрузить изображение, я использую следующую команду:

SELECT Picture FROM rhunkn1_omf.picture WHERE MeasNr = 2 AND 
ExperimentNr = 3 AND SequenceNr = 150;

В рабочей среде MySQL япосмотрите продолжительность и время выборки, если я запустил эту команду!Для небольших таблиц (800 МБ, 2376 записей, картинка 640x480) это очень быстро (<100 мс).Если я возьму таблицу большего размера (5800 МБайт, 9024 записи), она станет очень медленной (> 9 с).

Например, я запускаю следующую команду (для большой таблицы):

SELECT Picture FROM rhunkn1_omf.picture WHERE MeasNr = 2 AND 
ExperimentNr = 3 AND SequenceNr = 1025 LIMIT 0, 1000;

в первый раз это занимает 5,2 / 3,9 секунды (длительность / выборка).Эта же команда во второй раз занимает 0,2 / 0,2 секунды.Если я изменяю SequenceNr

SELECT Picture FROM rhunkn1_omf.picture WHERE MeasNr = 2 AND 
ExperimentNr = 3 AND SequenceNr = 977 LIMIT 0, 1000;

, это также очень быстро 0,1 / 0,3 секунды

Но если я изменяю ExperimentNr, например

SELECT Picture FROM rhunkn1_omf.picture WHERE MeasNr = 2 
AND ExperimentNr = 4 AND SequenceNr = 1025 LIMIT 0, 1000;

, это занимает много временивремя 4,4 / 5,9 секунды.

Кто-нибудь знает, почему база данных ведет себя так и как я могу улучшить скорость?Поможет ли мне создать несколько небольших графических таблиц и разделить нагрузку для каждой таблицы?Кстати, я использую MySQL 5.1.62 и таблицы MyISAM, но я также тестировал InnoDB, который был еще медленнее.

1 Ответ

2 голосов
/ 29 марта 2012

Было бы полезно, если бы вы могли опубликовать ОБЪЯСНИТЬ для запроса - в основном, ответы там (где-то).

Однако, я бы предположил, что это поведение объясняется тем, что ваш первичный ключ включает в себя время, а ваши запросы - нет; следовательно, они могут использовать индекс только частично. Я предполагаю, что план запроса использует индекс, чтобы отфильтровать записи в диапазоне MEASNR и ExperimentNr, а затем сканирует на соответствие sequenceNrs. Если существует много записей, соответствующих первым двум критериям, это может быть довольно медленным.

Причина, по которой вы видите ускорение во второй раз, заключается в том, что запросы кэшируются; это не очень предсказуемо, в зависимости от нагрузки, размера кеша и т. д.

Попробуйте создать индекс, соответствующий вашему предложению "where", и посмотрите, как EXPLAIN сообщает вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...