Im Folgenden sind drei MySQL-Abfragen. Der erste gibt alles zurück, was ich in einer Abfrage suche, während die zweiten beiden die gleichen Gesamtergebnisse liefern, aber in zwei Abfragen.Warum benötigen diese MySQL-Abfragen so drastisch unterschiedliche Verarbeitungszeiten, wenn sie gleichwertig erscheinen?
Ich wundere mich, warum die einzelne Abfrage dauert 2-100s mal länger zu laufen, wenn es scheint, wie Prozesszeit sollte zwischen allen drei Abfragen gleich sein. Gibt es eine Möglichkeit, die einzelne Abfrage so schnell wie die einzelnen Abfragen zu optimieren? Das Hinzufügen von mehr ORs innerhalb der WHERE-Anweisung der einzelnen Abfrage erhöht nicht die Prozesszeit, aber ich habe Fälle, in denen ich viel mehr ORs ausführen muss und die einzelne Abfrage schließlich so schnell ist wie zehn einzelne Abfragen.
Die einzelne Abfrage scheint auch nach der Ausführung zwischengespeichert zu werden, und das erste Mal kann Minuten dauern, während die einzelnen Abfragen immer innerhalb desselben Zeitrahmens abgeschlossen werden.
Würde ein mehrspaltiger Index hier einen großen Unterschied machen?
Bemerkenswert ist, dass die Tabelle kein ID-Feld als primären Index hat. Führt das zu diesem unerwünschten Verhalten?
Es ist schwierig, hier Tests auszuführen, da die Tabelle hundert Millionen Zeilen enthält und das Hinzufügen von Spalten und Indizes fast einen Tag dauert.
SINGLE QUERY (4.2S)
SELECT name_id
FROM staging_company_search
WHERE
(name_word_0 = 'the' AND name_word_1 = 'glazier')
OR (name_word_0 = 'bridgewaters' AND name_word_1 = '');
ÄQUIVALENTEN QUERIES AGGREGATE (0,8 s jeweils)
SELECT name_id
FROM staging_company_search
WHERE name_word_0 = 'the' AND name_word_1 = 'glazier';
SELECT name_id
FROM staging_company_search
WHERE name_word_0 = 'bridgewaters' AND name_word_1 = '';
ON EXPLAIN diese Abfragen
id select_type table type possible_keys key key_len ref rows extra
1 SIMPLE staging_company_search range name_word_0,name_word_1 name_word_0 102 NULL 2197605 Using index condition; Using where
1 SIMPLE staging_company_search ref name_word_0,name_word_1 name_word_1 102 const 128 Using index condition; Using where
1 SIMPLE staging_company_search ref name_word_0,name_word_1 name_word_0 102 const 33 Using index condition; Using where
DATABASE SCHEMA
CREATE TABLE `staging_company_search` (
`name_id` int(11) unsigned NOT NULL DEFAULT '0',
`name_word_0` varchar(100) NOT NULL,
`name_word_1` varchar(100) NOT NULL,
KEY `name_id` (`name_id`),
KEY `name_word_0` (`name_word_0`),
KEY `name_word_1` (`name_word_1`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Was passiert, wenn Sie versuchen, WO (name_word_0, name_word_1) in ((im Folgenden ', 'Glaserei'), ('Bridgewaters', '')) in der ersten Abfrage? –
Noch langsamer. Diese Abfrage enthält auch etwas andere Logik und führt zu vier Kombinationen von name_words im Gegensatz zu zwei. –
Ich verstehe. Wie wäre es mit einer Vereinigung der beiden äquivalenten Aggregatabfragen? Zeigt der EXPLAIN PLAN einen Unterschied zwischen diesen beiden? –