Конечно, как сказал @theomega, посмотрите на план выполнения.
Но я бы также посоветовал попытаться «очистить» ваше утверждение. (Я не знаю, какой из них быстрее - это зависит от размеров таблицы.) Обычно я бы попытался начать с чистого утверждения и начать с него оптимизацию. Но, как правило, чистый оператор облегчает оптимизатору выработать хороший план выполнения.
Итак, вот несколько замечаний по поводу вашего утверждения, которые могут замедлить ситуацию:
- пара внешних объединений (оптимизатору сложно определить используемый индекс)
- группа
- много столбцов для группировки по
Насколько я понимаю ваш SQL, этот оператор должен делать большую часть того, что делает ваш:
SELECT `item`.itemID, `item`.title, `item`.itemTypeID, `item`.
submitDate, `item`.deleted, `item`.ItemCat,
`item`.counter, `item`.userID, `users`.name,
TIMESTAMPDIFF(minute,`submitDate`,NOW()) AS 'timeMin'
FROM (item `item` INNER JOIN users `users`
ON (`users`.userID = `item`.userID)
ГДЕ
Конечно, при этом пропускается информация из таблиц, к которым вы присоединились, я бы посоветовал добавить необходимые столбцы с помощью подвыбора:
SELECT `item`.itemID,
(SELECT count (itemID)
FROM votes v
WHERE v.itemID = 'item'.itemID) as 'votes', <etc.>
Таким образом, вы можете избавиться от одного внешнего соединения и группы. Внешнее соединение заменяется подвыбором, поэтому существует компромисс, который может быть плох для «более чистого» утверждения.
В зависимости от количества элементов между item и myItems вы можете сделать то же самое, или вам придется придерживаться внешнего объединения (но нет необходимости повторно вводить группу с помощью).
Надеюсь, это поможет.