Я прочитал статьи об FORCE
индексе, но как я могу заставить MySQL IGNORE ALL
индексировать?
Я пытался SELECT * FROM tbl IGNORE INDEX(*)
, но мне не удалось.
Что касается того, почему я (и другие) должны сделать это: например, мне нужно было суммировать статистику рефереров по tld следующим образом:
SELECT
count(*) as c,
SUBSTRING
(
domain_name,
LENGTH(domain_name) - LOCATE('.', REVERSE(domain_name)) + 2
) as tld
FROM `domains_import`
IGNORE INDEX(domain_name)
GROUP BY tld
ORDER BY c desc
LIMIT 100
... но я всегда должен смотреть, какие индексы определены, или определить, какой индекс будет использоваться с помощью объяснения. Было бы очень удобно просто написать IGNORE INDEX ALL
и просто пофиг.
Кто-нибудь знает синтаксис или хак? (Десятки строк через таблицы определений MySQL на самом деле не являются ярлыком).
Добавлено из чата :
Bechmark:
без индекса = 148,5 с
с индексом = 180 секунд и все еще работает с отправкой данных Массив SSD настолько мощен, что вам почти нет дела до кеша данных ...
Определение для эталона:
CREATE TABLE IF NOT EXISTS `domains_import` (
`domain_id` bigint(20) unsigned NOT NULL,
`domain_name` varchar(253) CHARACTER SET ascii COLLATE ascii_bin NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `domains_import`
ADD PRIMARY KEY (`domain_id`),
ADD UNIQUE KEY `domain_name` (`domain_name`);
ALTER TABLE `domains_import`
MODIFY `domain_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT;
InnoDB, тест с индексом (без USE INDEX () или аналогичным) все еще выполняется, 250 секунд, я просто убил его.
LEFT JOIN
них. `USE INDEX ()` заставил MySQL выполнить сканирование таблицы в таблице строк по 20 КБ и 1 к 1JOIN
с вместо пересечения 500 строк между двумя индексами. Получил в 20 раз быстрее.