Heim  >  Artikel  >  Datenbank  >  Bei Zeichenfolgenfeldern in MySQL kommt es bei Verwendung von in zu Leistungseinbußen, wenn keine Anführungszeichen vorhanden sind.

Bei Zeichenfolgenfeldern in MySQL kommt es bei Verwendung von in zu Leistungseinbußen, wenn keine Anführungszeichen vorhanden sind.

迷茫
迷茫Original
2017-01-23 14:59:171529Durchsuche

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.

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn