Maison >base de données >tutoriel mysql >Situation provoquant l'échec de l'index MySQL
Plusieurs situations et exemples de code d'échec d'un index MySQL
Introduction :
Dans la base de données MySQL, l'index est l'un des facteurs importants pour améliorer les performances des requêtes. Cependant, nous constatons parfois que l'index ne joue pas le rôle attendu, que les performances des requêtes ne sont pas améliorées et qu'elles ralentissent même la requête. La raison est probablement que l'index n'est pas valide. Cet article présentera plusieurs situations courantes provoquant l'échec de l'index MySQL et donnera des exemples de code correspondants.
1. Utilisez des fonctions ou des expressions pour effectuer des opérations sur les colonnes d'index
Si des appels de fonction ou des opérations d'expression sont effectués sur des colonnes d'index dans l'instruction de requête, l'index deviendra invalide et MySQL ne pourra pas utiliser l'index pour des requêtes rapides. Voici un exemple :
-- 创建表 CREATE TABLE `user_address` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_id` int(11) DEFAULT NULL, `address` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`), KEY `idx_user_id` (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- 查询示例,索引失效 SELECT * FROM `user_address` WHERE YEAR(`address`) = 2022;
Dans le code ci-dessus, en raison de l'utilisation de la fonction YEAR
pour la colonne address
, MySQL ne peut pas utiliser l'index idx_user_id , entraînant un échec de l'index et une efficacité réduite des requêtes. <code>address
列使用了YEAR
函数进行运算,使得MySQL无法利用索引idx_user_id
,导致索引失效,查询效率下降。
二、在索引列上使用了函数
在索引列上使用函数也会导致索引失效,比如下面的示例:
-- 查询示例,索引失效 SELECT * FROM `user_address` WHERE LEFT(`address`, 5) = 'China';
上述代码中,由于对address
列使用了LEFT
函数,同样使得MySQL无法利用索引idx_user_id
,导致索引失效。
三、使用LIKE操作符模糊查询
在使用LIKE操作符进行模糊查询时,如果不是以%通配符开头,将导致索引失效。示例如下:
-- 查询示例,索引失效 SELECT * FROM `user_address` WHERE `address` LIKE 'Shanghai%';
上述代码中,由于LIKE操作符不是以%通配符开头,MySQL无法利用索引idx_user_id
,查询性能下降。
四、查询条件中使用OR关键字
在查询条件中使用OR关键字,如果每个OR子句中的列没有索引,将导致索引失效。示例如下:
-- 查询示例,索引失效 SELECT * FROM `user_address` WHERE `user_id` = 1 OR `address` = 'Shanghai';
上述代码中,由于user_id
和address
L'utilisation de fonctions sur les colonnes d'index entraînera également un échec de l'index, comme dans l'exemple suivant :
rrreee
adresse
. La fonction code>LEFT empêche également MySQL d'utiliser l'index idx_user_id
, provoquant l'échec de l'index.
3. Utilisez l'opérateur LIKE pour une requête floue
rrreee
Dans le code ci-dessus, comme l'opérateur LIKE ne commence pas par le caractère générique %, MySQL ne peut pas utiliser l'indexidx_user_id
et les performances de la requête diminuent. 🎜🎜4. Utilisez le mot-clé OR dans les conditions de requête 🎜Utilisez le mot-clé OR dans les conditions de requête Si les colonnes de chaque clause OR ne sont pas indexées, l'index sera invalide. Un exemple est le suivant : 🎜rrreee🎜Dans le code ci-dessus, puisque les colonnes user_id
et address
ont chacune leur propre index, elles sont utilisées dans les deux conditions du OR connexion par mot-clé respectivement. Différents index entraînent un échec de l'index. 🎜🎜Résumé : 🎜Lors de l'utilisation de la base de données MySQL, nous devons éviter les scénarios ci-dessus qui conduisent à un échec de l'index. Lors de l'écriture d'instructions SQL, vous devez essayer d'éviter d'effectuer des opérations de fonction ou d'expression sur les colonnes d'index et d'utiliser les opérateurs et méthodes de connexion appropriés pour créer des conditions de requête afin de garantir que l'index peut être utilisé efficacement dans les opérations de requête et améliorer les performances des requêtes. 🎜🎜Références : 🎜Documentation officielle MySQL (https://dev.mysql.com/doc/)🎜🎜(Remarque : la structure de la table et les instructions de requête dans les exemples ci-dessus sont uniquement à titre de démonstration. La situation réelle peut varier en fonction du version de la base de données et paramètres d'index, etc.)🎜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!