Maison  >  Article  >  base de données  >  Quelles situations de requête dans MySQL n'utilisent pas l'index ?

Quelles situations de requête dans MySQL n'utilisent pas l'index ?

WBOY
WBOYavant
2023-05-29 21:19:042997parcourir

mysql Quelles requêtes 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 <> &#39;mysql测试&#39;

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 (&#39;600538&#39;)  -- 走索引
SELECT * FROM `stock_data` WHERE `stock_code` IN (&#39;600538&#39;,&#39;688663&#39;,&#39;688280&#39;)  -- 走索引
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 :

#🎜🎜 #

1. Il n'y a pas de conditions de requête, ou les conditions de requête ne sont pas indexées dans la base de données métier, notamment les tables contenant une grande quantité de données.

Suggestions :

1 Modifier les colonnes indexées en tant que conditions de requête

2 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éécriture

3 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&#39;;走索引
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'avant

EXPLAIN SELECT * FROM teltab WHERE telnum LIKE ‘31%&#39; 走索引
EXPLAIN SELECT * FROM teltab WHERE telnum LIKE ‘%110&#39; 不走索引

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer