Документы MySQL сообщают в разделе 11.5.3 , что, несмотря на то, что может сказать стандарт SQL, очень просто использовать столбцы в предложении SELECT, которых нет в предложении GROUP BY, так долгопоскольку они функционально зависят от сгруппированного ключа.
MySQL расширяет использование GROUP BY, так что вы можете использовать неагрегированные столбцы или вычисления в списке выбора, которые не отображаются в предложении GROUP BY.Вы можете использовать эту функцию для повышения производительности, избегая ненужной сортировки и группировки столбцов.Например, вам не нужно группировать данные по customer.name в следующем запросе:
SELECT order.custid, customer.name,
MAX(payments) FROM order,customer
WHERE order.custid = customer.custid
GROUP BY order.custid;
В стандартном SQL вам потребуется добавить customer.name в предложение GROUP BY.В MySQL имя избыточно.
Звучит разумно.Однако, хотя я могу выбрать эти столбцы, это, похоже, отрицательно сказывается на производительности.
EXPLAIN SELECT o.id FROM objects o GROUP BY o.id;
+----+-------------+-------+-------+---------------+---------+---------+------+------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+---------------+---------+---------+------+------+--------------------------+
| 1 | SIMPLE | o | range | NULL | PRIMARY | 3 | NULL | 5262 | Using index for group-by |
+----+-------------+-------+-------+---------------+---------+---------+------+------+--------------------------+
(я понимаю, что этот запрос довольно глупый; это просто самая простая версияболее сложный запрос, имеющий ту же проблему.) При выборе только группы первичного ключа, сгруппированной по I, MySQL использует индекс первичного ключа.Однако, когда я включаю другие столбцы, MySQL этого не делает.
EXPLAIN SELECT o.id, o.name FROM objects o GROUP BY o.id;
+----+-------------+-------+------+---------------+------+---------+------+------+----------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+----------------+
| 1 | SIMPLE | o | ALL | NULL | NULL | NULL | NULL | 5261 | Using filesort |
+----+-------------+-------+------+---------------+------+---------+------+------+----------------+
Это использование файловой сортировки вместо индекса действительно отбрасывает меня назад.В настоящее время я хочу выбрать *
из этой таблицы, поэтому хотел бы избежать необходимости повторять все столбцы в группе и индексировать их.Есть ли способ заставить MySQL использовать индекс первичного ключа, как я ожидаю?