Maison  >  Article  >  base de données  >  Pour les champs de chaîne dans MySQL, lors de l'utilisation de in, il existe un problème de performances lorsqu'il n'y a pas de guillemets.

Pour les champs de chaîne dans MySQL, lors de l'utilisation de in, il existe un problème de performances lorsqu'il n'y a pas de guillemets.

迷茫
迷茫original
2017-01-23 14:59:171561parcourir

Scénarios et environnement

redhat6.5 64 bits 12 cœurs 16G

Nombre de tables 600w

MySQL 5.0

Description du problème

Pendant le processus d'utilisation de in, un collègue a écrit une simple requête conditionnelle (le champ est un index commun, varchar puisque les guillemets n'ont pas été utilisés lors de l'assemblage du sql, un grand nombre de). des requêtes lentes se sont produites

Problème SQL

select count(*) total from member_phone where phone in(1521xxx541,15845xxx412)

Comparaison du problème SQL et de l'écriture corrigée

Temps d'exécution

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)

EXPLIQUER

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)

Résumé

Parmi les trois types de SQL, l'efficacité de haut en bas est ou, avec guillemets, et sans guillemets. Lorsque vous ne voyez aucun guillemets dans l'explication, il est indiqué que le téléphone d'index est utilisé et que le type devient index. C'est presque la même chose qu'une analyse de table complète, sauf que MySQL analyse dans l'ordre de l'index au lieu des lignes. .

Rappel

Lorsqu'il y a plusieurs ors dans où, un grand nombre de conditions dans, ou plusieurs conditions, la performance réelle sera relativement mauvaise. Personnellement, je n'ai testé le test ci-dessus que dans MySQL 5.0. Je ne sais pas s'il a été officiellement optimisé dans les versions supérieures.

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn