Maison  >  Article  >  base de données  >  Explication détaillée des conseils et précautions d'utilisation de l'index MySQL

Explication détaillée des conseils et précautions d'utilisation de l'index MySQL

黄舟
黄舟original
2017-03-25 13:39:431206parcourir

Cet article présente principalement les compétences d'utilisation de l'index mysql et les précautions L'éditeur pense qu'il est plutôt bon. Maintenant, je vais le partager avec vous et le donner. à tout le monde. Soyez une référence. Suivons l'éditeur et jetons un coup d'œil.

1. Le rôle de l'index

Dans les systèmes d'application généraux, le rapport lecture-écriture est environ 10:1, et les opérations d'insertion et les opérations de mise à jour générales provoquent rarement des problèmes de performances. Les opérations les plus rencontrées, qui sont également les plus susceptibles de causer des problèmes, sont certaines opérations de requête complexes, donc l'optimisation des instructions de requête. est évidemment une priorité absolue.

Lorsque la quantité de données et d'accès est faible, l'accès à MySQL est très rapide, et le fait d'ajouter ou non des index a peu d'impact sur l'accès. Mais lorsque la quantité de données et de visites augmente considérablement, vous constaterez que MySQL ralentit, voire diminue. Dans ce cas, vous devez envisager d'optimiser SQL. La création d'un index correct et raisonnable pour la base de données est un moyen important d'optimisation de MySQL.

Le but de l'index est d'améliorer l'efficacité des requêtes, qui peut être comparé à un dictionnaire. Si nous voulons rechercher le mot "mysql", nous devons absolument localiser la lettre m, puis trouver le y. lettre de bas en bas, puis recherchez le sql restant. Sans index, vous devrez peut-être parcourir tous les mots pour trouver ce que vous voulez. En plus des dictionnaires, des exemples d'index peuvent être vus partout dans la vie, comme les horaires des trains dans les gares, les catalogues de livres, etc. Leurs principes sont les mêmes : en réduisant constamment la portée des données que vous souhaitez obtenir, vous pouvez filtrer les résultats finaux souhaités et, en même temps, transformer des événements aléatoires en événements séquentiels. méthode pour verrouiller les données.

Lors de la création d'un index, vous devez déterminer quelles colonnes seront utilisées dans les requêtes SQL, puis créer un ou plusieurs index pour ces colonnes. En fait, un index est également une table contenant la clé primaire ou le champ d'index, ainsi qu'un pointeur qui pointe chaque enregistrement vers la table réelle. Les index ne sont pas visibles pour les utilisateurs de la base de données ; ils sont uniquement utilisés pour accélérer les requêtes. Les moteurs de recherche de bases de données utilisent des index pour localiser rapidement les enregistrements.

Les instructions INSERT et UPDATE prendront plus de temps à s'exécuter sur les tables avec des index, mais les instructions SELECT s'exécuteront plus rapidement. En effet, lorsqu'une insertion ou une mise à jour est effectuée, la base de données doit également insérer ou mettre à jour la valeur d'index.

2. Création et suppression d'index

Type d'index :

  1. UNIQUE (uniquement Index ) : La même valeur ne peut pas apparaître, il peut y avoir une NULL valeur

  2. INDEX (index ordinaire) : le même contenu d'index est autorisé à apparaître

  3. PROMARY KEY (index de clé primaire) : La même valeur n'est pas autorisée

  4. index fulltext (index de texte intégral) : Il peut cibler un certain mot dans la valeur , mais l'efficacité est vraiment bonne Pas flatteur

  5. Indice combiné : essentiellement, plusieurs champs sont intégrés dans un seul index et la combinaison de valeurs de colonne doit être unique

(1) Utilisez l'instruction ALTER TABLE pour créer simplement

, puis ajoutez-la une fois la table créée.

ALTER TABLE 表名 ADD 索引类型 (unique,primary key,fulltext,index)[索引名](字段名)
//普通索引
alter table table_name add index index_name (column_list) ;
//唯一索引
alter table table_name add unique (column_list) ;
//主键索引
alter table table_name add primary key (column_list) ;

ALTER TABLE peut être utilisé pour créer trois formats d'index : index ordinaire, index UNIQUE et PRIMARY KEY index table_name est le nom de la table à ajouter à l'index column_list. colonnes à indexer, plusieurs colonnes Séparez chaque colonne par des virgules. Le nom d'index index_name est facultatif. Par défaut, MySQL attribuera un nom basé sur la première colonne d'index. De plus, ALTER TABLE permet de modifier plusieurs tables dans une seule instruction, afin que plusieurs index puissent être créés simultanément.

(2) Utilisez l'instruction CREATE INDEX pour ajouter des index à la table

CREATE INDEX peut être utilisé pour ajouter des index ordinaires ou des index UNIQUE à la table, et peut être utilisé pour créer des index lors de la construction de tables.

CREATE INDEX index_name ON table_name(username(length));

S'il est de type CHAR, VARCHAR, la longueur peut être inférieure à la longueur réelle du champ ; s'il est de type BLOB et TEXT, la longueur doit être spécifiée.

//create只能添加这两种索引;
CREATE INDEX index_name ON table_name (column_list)
CREATE UNIQUE INDEX index_name ON table_name (column_list)

table_name, index_name et column_list ont la même signification que dans l'instruction ALTER TABLE, et le nom de l'index n'est pas facultatif. De plus, vous ne pouvez pas utiliser l'instruction CREATE INDEX pour créer un index PRIMARY KEY.

(3) Supprimer l'index

La suppression de l'index peut être réalisée à l'aide de l'instruction ALTER TABLE ou DROP INDEX. DROP INDEX peut être traité comme une instruction dans ALTER TABLE, et son format est le suivant :

drop index index_name on table_name ;

alter table table_name drop index index_name ;

alter table table_name drop primary key ;

Parmi eux, dans les deux premières instructions, l'index index_name dans table_name est supprimé. Dans la dernière instruction, il n'est utilisé que pour supprimer l'index PRIMARY KEY, car une table ne peut avoir qu'un seul index PRIMARY KEY, il n'est donc pas nécessaire de spécifier le nom de l'index. Si aucun index PRIMARY KEY n'est créé mais que la table possède un ou plusieurs index UNIQUE, MySQL supprime le premier index UNIQUE.

Si une colonne est supprimée d'une table, l'index sera affecté. Pour un index multi-colonnes, si l'une des colonnes est supprimée, la colonne sera également supprimée de l'index. Si vous supprimez toutes les colonnes qui composent l'index, l'intégralité de l'index sera supprimée.

(4) Index combiné et index de préfixe

在这里要指出,组合索引和前缀索引是对建立索引技巧的一种称呼,并不是索引的类型。为了更好的表述清楚,建立一个demo表如下。

create table USER_DEMO
(
  ID          int not null auto_increment comment '主键',
  LOGIN_NAME      varchar(100) not null comment '登录名',
  PASSWORD       varchar(100) not null comment '密码',
  CITY         varchar(30) not null comment '城市',
  AGE         int not null comment '年龄',
  SEX         int not null comment '性别(0:女 1:男)',
  primary key (ID)
);

为了进一步榨取mysql的效率,就可以考虑建立组合索引,即将LOGIN_NAME,CITY,AGE建到一个索引里:

代码如下:

ALTER TABLE USER_DEMO ADD INDEX name_city_age (LOGIN_NAME(16),CITY,AGE);

建表时,LOGIN_NAME长度为100,这里用16,是因为一般情况下名字的长度不会超过16,这样会加快索引查询速度,还会减少索引文件的大小,提高INSERT,UPDATE的更新速度。

如果分别给LOGIN_NAME,CITY,AGE建立单列索引,让该表有3个单列索引,查询时和组合索引的效率是大不一样的,甚至远远低于我们的组合索引。虽然此时有三个索引,但mysql只能用到其中的那个它认为似乎是最有效率的单列索引,另外两个是用不到的,也就是说还是一个全表扫描的过程。

建立这样的组合索引,就相当于分别建立如下三种组合索引:

LOGIN_NAME,CITY,AGE
LOGIN_NAME,CITY
LOGIN_NAME

为什么没有CITY,AGE等这样的组合索引呢?这是因为mysql组合索引“最左前缀”的结果。简单的理解就是只从最左边的开始组合,并不是只要包含这三列的查询都会用到该组合索引。也就是说name_city_age(LOGIN_NAME(16),CITY,AGE)从左到右进行索引,如果没有左前索引,mysql不会执行索引查询。

如果索引列长度过长,这种列索引时将会产生很大的索引文件,不便于操作,可以使用前缀索引方式进行索引,前缀索引应该控制在一个合适的点,控制在0.31黄金值即可(大于这个值就可以创建)。

SELECT COUNT(DISTINCT(LEFT(`title`,10)))/COUNT(*) FROM Arctic; -- 这个值大于0.31就可以创建前缀索引,Distinct去重复

ALTER TABLE `user` ADD INDEX `uname`(title(10)); -- 增加前缀索引SQL,将人名的索引建立在10,这样可以减少索引文件大小,加快索引查询速度

三.索引的使用及注意事项   

EXPLAIN可以帮助开发人员分析SQL问题,explain显示了mysql如何使用索引来处理select语句以及连接表,可以帮助选择更好的索引和写出更优化的查询语句。

使用方法,在select语句前加上Explain就可以了:

Explain select * from user where id=1;

尽量避免这些不走索引的sql:

SELECT `sname` FROM `stu` WHERE `age`+10=30;-- 不会使用索引,因为所有索引列参与了计算

SELECT `sname` FROM `stu` WHERE LEFT(`date`,4) <1990; -- 不会使用索引,因为使用了函数运算,原理与上面相同

SELECT * FROM `houdunwang` WHERE `uname` LIKE&#39;后盾%&#39; -- 走索引

SELECT * FROM `houdunwang` WHERE `uname` LIKE "%后盾%" -- 不走索引

-- 正则表达式不使用索引,这应该很好理解,所以为什么在SQL中很难看到regexp关键字的原因

-- 字符串与数字比较不使用索引;
CREATE TABLE `a` (`a` char(10));
EXPLAIN SELECT * FROM `a` WHERE `a`="1" -- 走索引
EXPLAIN SELECT * FROM `a` WHERE `a`=1 -- 不走索引

select * from dept where dname=&#39;xxx&#39; or loc=&#39;xx&#39; or deptno=45 
--如果条件中有or,即使其中有条件带索引也不会使用。换言之,就是要求使用的所有字段,都必须建立索引, 我们建议大家尽量避免使用or 关键字

-- 如果mysql估计使用全表扫描要比使用索引快,则不使用索引

索引虽然好处很多,但过多的使用索引可能带来相反的问题,索引也是有缺点的:

  1. 虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT,UPDATE和DELETE。因为更新表时,mysql不仅要保存数据,还要保存一下索引文件

  2. 建立索引会占用磁盘空间的索引文件。一般情况这个问题不太严重,但如果你在要给大表上建了多种组合索引,索引文件会膨胀很宽

索引只是提高效率的一个方式,如果mysql有大数据量的表,就要花时间研究建立最优的索引,或优化查询语句。

使用索引时,有一些技巧:

1.索引不会包含有NULL的列

只要列中包含有NULL值,都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此符合索引就是无效的。

 2.使用短索引

对串列进行索引,如果可以就应该指定一个前缀长度。例如,如果有一个char(255)的列,如果在前10个或20个字符内,多数值是唯一的,那么就不要对整个列进行索引。短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作。

3.索引列排序

mysql查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作,尽量不要包含多个列的排序,如果需要最好给这些列建复合索引。

4.like语句操作

一般情况下不鼓励使用like操作,如果非使用不可,注意正确的使用方式。like ‘%aaa%'不会使用索引,而like ‘aaa%'可以使用索引。

5.不要在列上进行运算

6.不使用NOT IN 、a8093152e673feb7aba1828c43532094、!=操作,但211df07dbe7fea6e188a5b56353eb306,>=,BETWEEN,IN是可以用到索引的

7.索引要建立在经常进行select操作的字段上。

这是因为,如果这些列很少用到,那么有无索引并不能明显改变查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。

8.索引要建立在值比较唯一的字段上。

9.对于那些定义为text、image和bit数据类型的列不应该增加索引。因为这些列的数据量要么相当大,要么取值很少。

10.在where和join中出现的列需要建立索引。

11. S'il y a un signe d'inégalité (where column != ...) dans la condition de requête Where, MySQL ne pourra pas utiliser l'index.

12. Si une fonction est utilisée dans la condition de requête de la clause Where (comme : Where DAY (column) =...), MySQL ne pourra pas utiliser l'index.

13. Dans l'opération de jointure (lorsque les données doivent être extraites de plusieurs tables de données), mysql ne peut utiliser l'index que lorsque le type de données de la clé primaire et de la clé étrangère est le même, sinon l'index ne sera pas utilisé s’il est établi à temps.

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