У меня проблемы с групповым запросом в MySQL.
Вопрос
Есть ли причина, по которой в запросе не будет использоваться 10-символьный частичный индекс в поле varchar (255) для оптимизации группы с помощью?
Подробности
Моя настройка:
CREATE TABLE `sessions` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) DEFAULT NULL,
`ref_source` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`guid` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`initial_path` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`referrer_host` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`campaign` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `index_sessions_on_user_id` (`user_id`),
KEY `index_sessions_on_referrer_host` (`referrer_host`(10)),
KEY `index_sessions_on_initial_path` (`initial_path`(10)),
KEY `index_sessions_on_campaign` (`campaign`(10))
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
Некоторые столбцы и индексы здесь не отображаются, поскольку они не влияют на проблему.
То, что я хочу сделать, это запустить запрос, чтобы увидеть все ссылающиеся хосты и количество сеансов, приходящих с каждого.У меня нет огромного стола, но он достаточно большой, когда мне не хватает полного сканирования.Запрос, который я хочу выполнить:
SELECT COUNT(*) AS count_all, referrer_host AS referrer_host FROM `sessions` GROUP BY referrer_host;
Объяснение дает:
+----+-------------+----------+------+---------------+------+---------+------+--------+---------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+----------+------+---------------+------+---------+------+--------+---------------------------------+
| 1 | SIMPLE | sessions | ALL | NULL | NULL | NULL | NULL | 303049 | Using temporary; Using filesort |
+----+-------------+----------+------+---------------+------+---------+------+--------+---------------------------------+
У меня есть частичный индекс на referrer_host
, но он не используется.Даже если я попытаюсь USE INDEX
или FORCE INDEX
, это не поможет.Объяснение такое же, как и производительность.
Если я добавлю полный индекс на referrer_host
вместо 10-символьного частичного индекса, все будет работать лучше, если не мгновенно.(350 мс против 10 секунд)
Я проверил парциальные индексы, которые больше, чем самая длинная запись в поле, но также безрезультатно.Полный индекс - это единственное, что, кажется, работает.