Main > Databases | MySQL > SELECT COUNT и индексы

SELECT COUNT и индексы

12.02.2012 0 comments » Views: 3,812

mysql

Сегодня работал с большой таблицей. И столкнулся с очень интересной ситуацией, а именно непонятной мне скоростью выборки.
Может для кого-то это станет сразу понятным, но для меня это было не очевидно..

Итак таблица:

Запрос:

Скорость выполнения: 387 секунд

Explain:

Запрос:

Скорость выполнения: 0,141 секунда

Explain:

Мой вывод:
При эксплейне, mysql делает различия в столбце Extra. Первый раз он пустой, т.е. ничего нам не говорят, второй раз написано Using index. Смотрим в мануале, там написано:

Using index - Для извлечения данных из столбца используется только информация дерева индексов; при этом нет необходимости производить собственно чтение записи. Это применимо для случаев, когда все используемые столбцы таблицы являются частью одного индекса.

Теперь все становится ясно. Итак в первом запросе, для того чтобы подсчитать id, нам нужно все равно пройтись по всем записям, не обращая внимание на индекс, а для этого их нужно поднять из БД. Т.к. у нас есть BLOB поля, то каждая запись и поднимается долго. Соответственно, те 380 секунд, это я думаю именно отсюда. Во втором же случае, мы вообще не используем поднятие данных, и читаем только индекс, отсюда скорость.

Конечно правильно, было бы отделить текстовые поля от полей, которые можно проиндексировать, но когда структуру придумал не ты, все становится сложнее. Самый оптимальный вариант, это использовать для поиска второй вариант, а именно делать выборку по полю которое проиндексировано. Так же, думаю можно получить тот же результат, если сделать составной индекс id+lvl. Но это уже модификация базы.

Author: | Rating: 4/5 | Tags:

Leave a Reply

Your email address will not be published. Required fields are marked *

Allowed HTML-tags: <a>, <code>, <i>, <em>, <strong>, <b>, <u>, <strike>