2015-12-31 2 views
2

У меня есть MySQL (точнее, MariaDB) база данных, которая содержит разные «записи» (не путать с записями базы данных, это единицы данных, с которыми моя система работает, и состоят из нескольких полей ключа-значения). Каждая «запись» является частью «экземпляра». Каждый «экземпляр является частью„группы пользователей запись „может быть частью„категории“Медленный запрос GROUP BY из-за неправильного использования INDEX

Я пытаюсь написать запрос SQL, который извлекает все категории для группы пользователей“ Каждый.“-. И получить . количество записей, которые существуют во всех случаях в каждой категории My SQL заявление выглядит следующим образом:.

SELECT COUNT(r.id) AS records_number, c.category 
FROM records r 
INNER JOIN feeds_instances i ON r.instance = i.id 
INNER JOIN feeds_instances_categories c ON c.instance = i.id 
WHERE i.user_group = '0' 
AND r.reviewed IS NULL 
GROUP BY c.category 
LIMIT 0 , 30 

при проверке запроса с SQL_NO_CACHE, я получаю запрос на 0.2+ секунд при удалении GROUP BY, он сокращается до 0,0008 секунд. Когда я выполняю команду EXPLAIN для SQL-запроса, я получаю, что индекс, используемый для таблицы c, является «экземпляром», а не «категорией» y "(таблица feeds_instances_categories имеет три столбца: ID, пример, Категория. Индексы существуют на пример и категория).

Я пытаюсь заставить GROUP BY использовать индекс Категория. Я попытался использовать команду USE INDEX, но я получаю ошибки. Я, скорее всего, не делаю этого правильно и не могу найти, как это сделать правильно в документации.

Любая помощь будет оценена!

+0

Я удалил тег SQL Server, потому что он не поддерживает 'LIMIT'. –

+0

Будет «SELECT {yourFields} FROM feeds_instances_categories c INNER JOIN feeds_instances i ON i.id = c.instance записи INNER JOIN r ON r.instance = i.id {остальная часть}' help? – Terminus

ответ

1

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

Вы должны быть уверены, что у вас есть нужные индексы для объединений и где фильтры в вашем запросе. Это, вероятно, будет: records(instance, reviewed), feeds_instances(user_group, id) и feeds_instances_categories(instance, category).

Если user_group объявлен как число, то оставьте одинарные кавычки. Сбивание строк и чисел может также путать оптимизатор.

+1

Добавление записей (экземпляр, обзор) сократило время запроса с 0.2 до 0.02 сек! Спасибо! – Idan

0

Сколько записей у вас есть в вашей базе данных.

Если вы исключите запрос без группы, LIMIT вырезает все после 30 записей. НО группа по функциям повторяет все ваши записи в таблице, а затем ограничивает их.

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