index mysql et son optimisation

indice

1. Instruction SQL de base

1. Créez un index

CREATE  [UNIQUE | FULLTEXT | SPATIAL]  INDEX  索引名 ON  表名(字段名) [USING 索引方法]

2. Supprimer l'index

drop index 索引名

3. Afficher l'index

show index on tablename;

2. Raisons de la dégradation des performances

1. Instructions de requête mal écrites
2. Échec de l'index: index à valeur unique, index composite
3. Trop de jointures (défauts de conception ou exigences non uniformes)
4. Réglage du serveur et divers réglages de paramètres (cache, nombre de threads)

3. Avantages

  1. Accélérer les requêtes
  2. Réduisez le tri

4. Inconvénients

  1. Augmentez le verrouillage de l'écart, ralentissez la vitesse de mise à jour des données
  2. Prenez le temps de construire un index optimisé

5. Classification

  1. Index à valeur unique: ne contient qu'une seule colonne
  2. Index unique: la valeur de l'index est unique et peut être vide
  3. Index composite: index avec plusieurs colonnes

6. Principe de recherche

  1. Arbre B
  2. hacher
  3. arbre r
  4. texte intégral

7. Dans quelles circonstances créer un index

  1. La clé primaire est automatiquement indexée (le nom d'utilisateur et la zone dans le roi ne seront pas la clé primaire commune, à droite ?? Ne pas mettre à jour fréquemment, et la loterie peut être effectuée en utilisant le nom d'utilisateur et la partition!)
  2. Indexation de clé étrangère
  3. Indexation des champs utilisés pour le regroupement des statistiques et le tri
  4. Une concurrence élevée a tendance à créer un indice commun
  5. Indexation des champs fréquemment interrogés

8. Dans quelles circonstances l'indice ne sera-t-il pas établi?

  1. Champs qui ne sont pas utilisés dans where, tels que le propre profil de l'utilisateur
  2. Les champs fréquemment mis à jour n'ont pas de sens pour l'indexation
  3. Il y a très peu d'enregistrements dans le tableau ci-dessous 3 millions
  4. Le taux de répétition dans les données est trop élevé

9. Analyse des performances

1. expliquer

  1. utilisation
  2. taper
  3. supplémentaire
  4. rangée
  5. clé possible
  6. clé
  7. table
  8. identifiant
  9. réf

2. Journal des requêtes lent

4. Script de données de lot

5. afficher le profil

6. Requête de journal global

7. Idée générale

  1. Démarrez et capturez le journal des requêtes lentes.
  2. expliquer + analyse SQL.
  3. show profile interroge les détails d'exécution et le cycle de vie de SQL sur le serveur.
  4. Réglage des paramètres du serveur de données SQL.

10. Optimisation des performances

1. Connexion de table unique

2. Deux tables sont connectées

1. Connexion gauche et droite plus index opposé (connexion gauche plus table droite, connexion droite plus table gauche)

3. Cas d'optimisation à trois tables

  1. Une petite table entraîne une grande table
  2. Optimiser d'abord le sous-ensemble
  3. Assurez-vous que la table de jointure contient des instructions optimisées
  4. Ne soyez pas avare avec le tampon de jointure

4. Principes d'optimisation de l'indice

  1. Match complet mon préféré
create index on user a('c', 'd', 'e');
select * from user where c = 'x';  #可以用到索引
select * from user where d = 'y' and  e = 'z' #索引失效了

第二个违背了最佳左前缀法则:
建立索引的第一字段不能丢(索引失效)
建立索引的中间字段不能断(否则部分使用索引)
  1. N'effectuez aucune opération de fonction sur l'index (calcul, fonction, conversion de type)
select * from user where left(id, 4) = 1;#在索引left上使用了函数

  1. Une fois la plage utilisée, toute invalidation, essayez de sélectionner (sélectionner) le champ indexé
select * from user where id = 4 and age > 1 and name = "te";#使用了范围
范围之后的就失效了, id会用到索引,但是age和age之后就会出现索引失效
select id, age, name where id = 4 and age  > 1 and name = "te"#会使用索引,所以仍旧是使用索引
  1. L'utilisation de <>,! =, Est null, null, n'est pas nul, comme "% name", etc. entraînera également l'échec de l'index
select * from name where name like "%name";#索引失效
select * from name where name like "name%";#like 百分在右边

Et si vous devez charger le côté gauche?
Utilisez un index de couverture

create index on user idx_name_age(`name`, `age`);
select name, from user where name like "%tea%";
  1. Le type varchar doit être placé entre guillemets simples
select * from name = '3000';
select * from name = 3000;#索引失效
都能查到,但是出现了隐式的类型转换

Le frère aîné de premier plan ne peut pas mourir et le frère du milieu ne peut pas rompre; le signe de pourcentage après le semblable, le type de chaîne est entre guillemets, et tout après la plage est invalide.

  1. group by peut produire des tables temporaires
  2. La petite table entraîne la grande table.
select * from A where id in (select id from B);#B表小于大表
select * from A where exists(select id from B);#A表小于大表
exists就是把A中的字段放入子查询寻中进行比较。

Je suppose que tu aimes

Origine blog.csdn.net/fuzekun/article/details/104462447
conseillé
Classement