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.