Ich habe Artikel über FORCE
Index gelesen , aber wie kann ich MySQL zu IGNORE ALL
Indizes zwingen ?
Ich habe es versucht SELECT * FROM tbl IGNORE INDEX(*)
, aber ich war nicht erfolgreich.
Warum ich (und andere) dies tun müssen: Zum Beispiel musste ich die Referenzstatistiken wie folgt zusammenfassen:
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
... aber ich muss immer schauen, welche Indizes definiert sind oder bestimmen, welcher Index über Explain verwendet wird. Es wäre sehr praktisch, einfach zu schreiben IGNORE INDEX ALL
und sich einfach nicht darum zu kümmern.
Kennt jemand die Syntax oder einen Hack? (Dutzende Zeilen über MySQL-Definitionstabellen sind wirklich keine Abkürzung).
Aus der Chat-Diskussion hinzugefügt :
Bechmark:
kein Index = 148,5 Sekunden
mit Index = 180 Sekunden und immer noch mit Daten senden Das SSD-Array ist so leistungsfähig, dass Sie sich fast nicht um den Datencache kümmern ...
Definition für 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, der Test mit Index (kein USE INDEX () oder ähnliches) läuft noch, 250 Sekunden, ich habe ihn gerade beendet.
LEFT JOIN
mir vorhandenen entfernt wurden. `USE INDEX ()` hat MySQL veranlasst, einen Tabellenscan für eine 20K-Zeilentabelle und 1-zu-1-JOIN
s durchzuführen, anstatt 500 Zeilen zwischen zwei Indizes zu kreuzen. 20x schneller geworden.