MySQL innodb ищет компромисс между непрерывным чтением - PullRequest
0 голосов
/ 26 февраля 2010

Будет ли mysql (innodb) поддерживать более высокую частоту (количество запросов в секунду) таких запросов, как (A) или (B)?

(А) SELECT * FROM t1 WHERE pkey BETWEEN 2000 and 2001 AND x > 300

В (A) первичный ключ выбирает диапазон из 800 строк. «х» не индексируется. есть один поиск диапазона и одно непрерывное чтение длиной 200 КБ.

(В) (SELECT * FROM t1 WHERE pkey BETWEEN 2000 and 2001 AND x > 300) UNION ALL (SELECT * FROM t1 WHERE pkey BETWEEN 3000 and 3001 AND x > 300)

В (B) первичный ключ выбирает диапазон из 200 строк. «х» не индексируется. есть два поиска диапазона и 2 смежных чтения длиной 50 КБ.

Таким образом, чтобы подвести итог, (A) имеет 2x, которое ищет диск, но 1/2-ое столько же непрерывного чтения. И наоборот, (B) имеет половину поиска диска, но вдвое больше непрерывного чтения.

В общем, я предполагаю, что поиск медленный, а непрерывное чтение быстрое, но я предполагаю, что один дополнительный поиск предпочтительнее, чем чтение 10 МБ дополнительных данных. Где компромисс, примерно?

Ответы [ 2 ]

0 голосов
/ 24 июля 2010

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

Позвольте мне угадать для вас:

а) Ранжированный поиск pkey очень эффективен, потому что он находится в кластерном индексе. Для всего, что находится в диапазоне, оно гласит «следующий, следующий следующий», чтобы проверить, совпадает ли X.

б) Это серия точечных поисков. Но он создает временную таблицу, даже если вы думаете, что она может передать вам результаты (!) http://www.facebook.com/note.php?note_id=276225210932

Мой голос почти наверняка (а).

0 голосов
/ 26 февраля 2010

Оптимизатор должен принять решение о том, как реализовать запрос. Просто напишите, как хотите.

Используйте EXPLAIN, чтобы примерно увидеть, что это сделано. Возможно, он выполняет два сканирования диапазона индекса pkey.

В общем, лучше читать меньше строк. Вы также можете хранить больше их в пуле буферов. Два сканирования диапазона лучше, чем одно в общем случае.

Я предполагаю, что ваша таблица t1 не будет полностью помещаться в памяти, в этом случае она в основном академическая.

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