Avant-propos
Aujourd'hui, j'ai rencontré un problème de blocage de site Web. Il m'a fallu quelques minutes pour m'en remettre, j'ai trouvé un sql dans un script planifié, et l'efficacité d'exécution était. très lent. Le DBA a suggéré de changer ou d'entrer, ce qui a amélioré l'efficacité des centaines de fois
Description du scénario
1 Requête d'association à deux tables
2 La quantité de données dans la table1 est proche de 1 million
3. des données dans la table2 sont proches de 9 millions
4. Le champ de titre dans les conditions de requête n'est pas indexé
5. Instruction de requête originale
SELECT a.id as id FROM `table1`as a left join table2 as b on a.id=b.id WHERE b.title="衣服" or b.title="裤子" or b.title="帽子" limit 0,100
6. Instruction de requête transformée
SELECT a.id as id FROM `table1`as a left join table2 as b on a.id=b.id WHERE b.title IN ("衣服","裤子","帽子") limit 0,100
Efficacité après transformation
Le temps d'exécution de l'original. SQL est de 5 secondes, après le changement, cela ne prend que 0,01 seconde
La raison
J'ai vérifié les informations et constaté que lorsque le volume de données dépasse un million et que les conditions ne sont pas indexées, l'efficacité de la requête de ou est bien inférieure à celle de in. L'efficacité de or est O(n), tandis que l'efficacité de in est O(logn). Lorsque n est plus grand, la différence d'efficacité devient plus évidente.
Apprentissage recommandé : "tutoriel vidéo mysql"