Eu li artigos sobre FORCE
índice, mas como posso forçar o MySQL a IGNORE ALL
índices?
Eu tentei SELECT * FROM tbl IGNORE INDEX(*)
, mas não tive sucesso.
Quanto ao motivo pelo qual eu (e outros) precisamos fazer isso: Por exemplo, eu precisava resumir as estatísticas dos referenciadores por tld assim:
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
... mas eu sempre tenho que olhar para quais índices são definidos ou determinar qual índice será usado pelo Explain. Seria muito útil simplesmente escrever IGNORE INDEX ALL
e simplesmente não se importar.
Alguém conhece a sintaxe ou um hack? (Dezenas de linhas através de tabelas de definição do MySQL não são realmente um atalho).
Adicionado a partir da discussão no chat :
Bechmark:
sem índice = 148,5 segundos
com índice = 180 segundos e ainda em execução com o envio de dados A matriz SSD é tão poderosa que você quase não se importa com o cache de dados ...
Definição para benchmark:
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;
No InnoDB, o teste com o índice (sem USE INDEX () ou similar) ainda está em execução, 250 segundos, acabei de o matar.
LEFT JOIN
eu tinha. `USE INDEX ()` fez o MySQL fazer uma varredura de tabela em uma tabela de 20K linhas e 1 paraJOIN
1s em vez de cruzar 500 linhas entre dois índices. Ficou 20x mais rápido.