Maison  >  Article  >  base de données  >  Situation provoquant l'échec de l'index MySQL

Situation provoquant l'échec de l'index MySQL

WBOY
WBOYoriginal
2024-02-18 18:02:05993parcourir

Situation provoquant léchec de lindex 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_idaddress

2. Utilisation de fonctions sur les colonnes d'index

L'utilisation de fonctions sur les colonnes d'index entraînera également un échec de l'index, comme dans l'exemple suivant :
rrreee

Dans le code ci-dessus, en raison de l'utilisation de la colonne 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

Lors de l'utilisation de l'opérateur LIKE pour une requête floue, s'il ne commence pas par le caractère générique %, l'index échouera. Un exemple est le suivant :

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'index idx_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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn