Szenarien und Umgebung
redhat6.5 + 64-bit + 12 Kerne + 16G
Anzahl der Tabellen 600w
MySQL 5.0
Problembeschreibung
Während der Verwendung von in hat ein Kollege eine einfache bedingte Abfrage geschrieben (das Feld ist ein gemeinsamer Index, varchar, da beim Zusammenstellen der SQL keine Anführungszeichen verwendet wurden). Es ist eine große Anzahl langsamer Abfragen aufgetreten
Problem-SQL
select count(*) total from member_phone where phone in(1521xxx541,15845xxx412)
Vergleich von Problem-SQL und korrigiertem Schreiben
Ausführungszeit
mysql> select count(*) total from member_phone where phone in(1521xxx541,15845xxx412); +-------+ | total | +-------+ | 1 | +-------+ 1 row in set (2.76 sec) mysql> select count(*) total from member_phone where phone in('1521xxx541','15845xxx412'); +-------+ | total | +-------+ | 1 | +-------+ 1 row in set (0.01 sec) mysql> select count(*) total from member_phone where (phone='1521xxx541' or phone='15845xxx412'); +-------+ | total | +-------+ | 1 | +-------+ 1 row in set (0.00 sec)
ERKLÄREN
mysql> explain select count(*) total from member_phone where phone in(1521xxx541,15845xxx412) \G; *************************** 1. row *************************** id: 1 select_type: SIMPLE table: member_phone type: index possible_keys: phone key: phone key_len: 18 ref: NULL rows: 6307075 Extra: Using where; Using index 1 row in set (0.00 sec) mysql> explain select count(*) total from member_phone where phone in('1521xxx541','15845xxx412') \G; *************************** 1. row *************************** id: 1 select_type: SIMPLE table: member_phone type: range possible_keys: phone key: phone key_len: 18 ref: NULL rows: 2 Extra: Using where; Using index 1 row in set (0.00 sec) mysql> explain select count(*) total from member_phone where (phone='1521xxx541' or phone='15845xxx412') \G; *************************** 1. row *************************** id: 1 select_type: SIMPLE table: member_phone type: range possible_keys: phone key: phone key_len: 18 ref: NULL rows: 2 Extra: Using where; Using index 1 row in set (0.01 sec)
Zusammenfassung
Unter den drei SQL-Typen beträgt die Effizienz von hoch nach niedrig oder, in mit Anführungszeichen und in ohne Anführungszeichen . Wenn Sie in der Erklärung keine Anführungszeichen sehen, wird angezeigt, dass das Indextelefon verwendet wird und der Typ zum Index wird. Dies ist fast dasselbe wie ein vollständiger Tabellenscan, außer dass MySQL in der Reihenfolge des Indexes statt der Zeilen scannt .
Erinnerung
Wenn es mehrere ORs in Wo, eine große Anzahl von Bedingungen in IN oder mehrere In-Bedingungen gibt, ist die tatsächliche Leistung relativ schlecht. Ich persönlich habe den obigen Test nur in MySQL 5.0 getestet. Ich weiß nicht, ob er in höheren Versionen offiziell optimiert wurde.