Главная > MySQL | Базы данных > SELECT COUNT и индексы

SELECT COUNT и индексы

12.02.2012 0 коммент. » Просмотры: 3 238
 

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

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

Запрос:

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

Explain:

Запрос:

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

Explain:

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

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

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

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

Автор: | Теги:

Важно

У нас заработал ФОРУМ. Все вопросы, которые не касаются статьи, а так же вопросы по конкретно вашему случаю нужно задавать и обсуждать именно там, в разделе "Помощь пользователям".

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Разрешены HTML-теги: <a>, <code>, <i>, <em>, <strong>, <b>, <u>, <strike>