Maison > Article > base de données > Quelles situations de requête dans MySQL n'utilisent pas l'index ?
1 La colonne index participe au calcul et n'utilise pas l'index
SELECT `username` FROM `t_user` WHERE age=20;-- 会使用索引 SELECT `username` FROM `t_user` WHERE age+10=30;-- 不会使用索引!!因为所有索引列参与了计算 SELECT `username` FROM `t_user` WHERE age=30-10;-- 会使用索引
2. une fonction et ne peut pas utiliser l'index# 🎜🎜#
-- 不会使用索引,因为使用了函数运算,原理与上面相同 SELECT username FROM t_user WHERE concat(username,'1') = 'admin1'; -- 会使用索引 SELECT username FROM t_user WHERE username = concat('admin','1');3. Utilisez l'instruction like pour la colonne d'index et ne pouvez pas utiliser l'index
SELECT * FROM USER WHERE username LIKE 'mysql测试%' --走索引 SELECT * FROM USER WHERE username LIKE '%mysql测试' --不走索引 SELECT * FROM USER WHERE username LIKE '%mysql测试%' --不走索引4. , comparaison directe entre les colonnes de chaîne et les nombres, sans utiliser l'index#🎜 🎜#
-- stock_code字符串类型带索引 SELECT * FROM `stock_data` WHERE stock_code = '600538' --走索引 SELECT * FROM `stock_data` WHERE stock_code = 600538 --不走索引
5 Essayez d'éviter les opérations OR Tant qu'il y a un champ sans index, modifiez l'instruction sans utiliser l'index ou en utilisant. l'indice !
-- stock_code带索引,open不带索引 SELECT * FROM `stock_data` WHERE `stock_code` = '600538' OR `open` = 6.62 -- 不走索引 -- stock_code带索引,up_down_pre带索引 SELECT * FROM `stock_data` WHERE `stock_code` = '600538' OR `up_down_pre` = 5.1 -- 走索引
6. où id !=2 ou où id a8093152e673feb7aba1828c43532094
SELECT * FROM t_user WHERE username <> 'mysql测试'
7. S'il est nul, il ne peut pas utiliser l'index s'il n'est pas nul. N'utilisez pas l'index !
SELECT * FROM t_user WHERE username IS NULL -- 不走索引 SELECT * FROM t_user WHERE username IS NOT NULL -- 不走索引
8. La colonne d'index utilise l'instruction in, et l'index ne peut pas être utilisé
-- stock_code数据类型为varchar SELECT * FROM `stock_data` WHERE `stock_code` IN ('600538') -- 走索引 SELECT * FROM `stock_data` WHERE `stock_code` IN ('600538','688663','688280') -- 走索引 SELECT * FROM `stock_data` WHERE `stock_code` IN (大量数据) -- 不走索引 SELECT * FROM `stock_data` WHERE `stock_code` IN (600538) -- 不走索引
La situation de non-utilisation de l'index :
#🎜🎜 #Suggestions :
1 Modifier les colonnes indexées en tant que conditions de requête2 Ou indexer les colonnes fréquemment interrogées# 🎜🎜##🎜 🎜#2. L'ensemble de résultats de la requête contient la plupart des données de la table d'origine, qui doivent être supérieures à 25 %
L'ensemble de résultats de la requête dépasse le nombre total lorsque le nombre de lignes est de 25%, l'optimiseur estime qu'il n'est pas nécessaire d'indexer.Suggestion :
1 Si l'entreprise le permet, vous pouvez utiliser le contrôle des limites. 2 Sur la base du jugement commercial, existe-t-il une meilleure solution ? S'il n'y a pas de meilleure solution de réécriture3 essayez de ne pas stocker ces données dans MySQL. Mettez-le dans Redis.3. L'index lui-même n'est pas valide et les statistiques sont irréelles
L'index a la capacité de s'auto-entretenir, ce qui est utile lorsque le contenu de la table change fréquemment, une défaillance de l'index peut survenir.Modifier le plan :
Sauvegarder les données des tables, supprimer et reconstruire les tables associées.4. Les conditions de requête utilisent des fonctions sur les colonnes d'index ou effectuent des opérations sur les colonnes d'index. Les opérations incluent (+, -, *, /,!, etc.)
#. 🎜 🎜#Changer de méthode :
Réduire l'utilisation des opérations de calcul telles que l'addition, la soustraction, la multiplication et la division dans MySQL.
5. La conversion implicite entraîne un échec de l'index. C'est également une erreur courante dans le développement. création Le champ est varchar();select * from stu where name = ‘111';走索引 select * from stu where name = 111;不走索引Change méthode : Consulter R&D, et la requête d'instruction est conforme à la spécification.
6.a8093152e673feb7aba1828c43532094 , pas dedans sans indexation (index auxiliaire)
Changement de méthode :#🎜🎜 # Essayez de ne pas utiliser la méthode ci-dessus pour interroger ou sélectionner l'index comme condition de filtre.
Séparez >, <, en mai ou non. Cela est lié au résultat défini. Essayez d'ajouter une limite
ou ou en fonction de l'entreprise. Essayez de le changer en union
7.like "%" Le signe pour cent n'est pas à l'avantEXPLAIN SELECT * FROM teltab WHERE telnum LIKE ‘31%' 走索引 EXPLAIN SELECT * FROM teltab WHERE telnum LIKE ‘%110' 不走索引
Changer de méthode : #🎜 🎜##🎜🎜 Pour les besoins de recherche de type #%linux%, vous pouvez utiliser elasticsearch+mongodb, un produit de base de données spécialisé dans les services de recherche
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!