2015-09-02 3 views
0

Я пытаюсь оптимизировать очень простой пример MYSQL, и я не могу понять, как предотвратить выполнение нижеуказанного запроса при сканировании таблицы при ссылке на столбец uid. Используя пояснение, tt показывает возможный ключ правильно, но фактически не использует ключ и не сканирует все строки.Проблема с пониманием того, как избавиться от сканирования таблицы в базовом примере объяснения MYSQL

CREATE TABLE `Foo` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `barId` int(10) unsigned NOT NULL, 
    `uid` int(10) unsigned NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `barId` (`barId`), 
    KEY `uid` (`uid`) 
) 

explain 
select count(uid) as userCount 
FROM Foo 
WHERE barId = 1 
GROUP BY barId 

id select_type table type possible_keys key rows Extra 
1 SIMPLE  Foo ALL barId   NULL 4 Using where 

Выборочные данные

id,barId,uid 
1,1,1 
2,1,2 
3,1,3 
4,2,4 
+0

'GROUP BY' не нужно с' barID = 1' – Uueerdo

+0

уверенно ... однако все еще выполняется сканирование таблицы без него. – MonkeyBonkey

ответ

1

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

  • Когда я ОБЪЯСНЕНИЕ пустым, ключ «barId».
  • С 4 строками (ваши данные ), ключ NULL.
  • С 4096 строк (я выполнил INSERT SELECT до сам по себе несколько раз), ключ возвращается к «barID».

Из Руководства по адресу bottom.

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

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