Ho letto articoli FORCE
sull'indice, ma come posso forzare MySQL agli IGNORE ALL
indici?
Ci ho provato SELECT * FROM tbl IGNORE INDEX(*)
, ma non ci sono riuscito.
Per quanto riguarda il motivo per cui io (e altri) abbiamo bisogno di fare questo: per esempio, dovevo riassumere le statistiche dei referenti in questo modo:
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
... ma devo sempre guardare quali indici sono definiti o determinare quale indice verrà utilizzato tramite Spiega. Sarebbe molto utile semplicemente scrivere IGNORE INDEX ALL
e semplicemente non importa.
Qualcuno conosce la sintassi o un hack? (Decine di linee tramite le tabelle di definizione di MySQL non sono in realtà un collegamento).
Aggiunto dalla discussione in chat :
di benchmark:
nessun indice = 148,5 secondi
con indice = 180 secondi e ancora in esecuzione con l'invio di dati L'array SSD è così potente che quasi non ti interessa la cache dei dati ...
Definizione per 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;
InnoDB, il test con indice (nessun USE INDEX () o simile) è ancora in esecuzione, 250 secondi, l'ho appena ucciso.
LEFT JOIN
ho rimosso alcuni dei miei. `USE INDEX ()` ha reso MySQL eseguendo una scansione della tabella su una tabella di 20K righe e 1 a 1JOIN
s invece di incrociare 500 righe tra due indici. Ottenuto 20 volte più veloce.