Optimisation des requêtes MySQL. Optimisation des requêtes vers la base de données MySQL. Combiner plusieurs demandes en une seule

Regardons un document. Des éléments HTML y sont formés (affichés à l'écran dans le navigateur). Ils sont formés à partir de balises. Vous placez des balises, elles sont traitées par l'analyseur HTML (disponible dans n'importe quel navigateur) et construisent des éléments HTML. Et l’apparence de ces éléments est déterminée par CSS.

Tous les éléments HTML ont 4 zones : la zone de remplissage, la bordure, le remplissage et le contenu de l'élément. A quoi servent-ils ?

  • Marges(marge) - nécessaire pour réguler l'interaction de cet élément avec les limites d'autres éléments.
  • Le remplissage est la distance entre le cadre et le contenu d'un élément donné.
  • Le contenu de l'élément lui-même. C'est clair ici. S'il y a des éléments imbriqués, alors ils sont situés dans cette zone.
  • Cadre (bordure). Décrit les limites d'un élément. Schématiquement, les 4 zones peuvent être représentées comme suit :

Il faut comprendre que chaque élément se situe dans une certaine zone. Cette zone pour l’élément qui se trouve à l’intérieur est appelée un conteneur. Ceux. Le conteneur est la zone de contenu de l'élément parent. Cette zone détermine l'espace pour construire l'élément interne. Cela signifie que l'élément interne s'adaptera à la taille de cette zone.

Marges

C'est à ce moment-là que notre élément interagit avec les limites du conteneur et avec les limites des éléments voisins (ceux qui se trouvent à côté de lui dans le code). Règles de base :

  • margin-top : auto|magnitude|% - marge supérieure.
  • margin-right : auto|magnitude|% - marge droite.
  • margin-bottom : auto|magnitude|% - marge inférieure.
  • margin-left : auto|magnitude|% - marge gauche.
  • marge : marge-marge supérieure-droite marge-marge inférieure-gauche – règle préfabriquée.

La valeur « auto » signifie que le navigateur analysera indépendamment ces valeurs. La taille du retrait peut être spécifiée dans les valeurs suivantes : em, ex, px. Les pourcentages (%) sont calculés à partir de la largeur du conteneur (à partir de la zone de contenu de l'élément parent). Si vous spécifiez une valeur négative, les bordures des éléments à l'intérieur du conteneur parent entreront en collision les unes avec les autres.

La règle « marge » est composite ; les valeurs des 4 marges sont indiquées ici (en partant du haut et dans le sens des aiguilles d'une montre). Exemples :

Marge : 10 px, 20 px, 20 px, 30 px ;

marge : 10px 20px 30px ;

- la marge de gauche à droite est la même marge : 10px 20px ;

  • - la marge haut-bas et gauche-droite est la même marge : 10px ;
  • - tous les retraits sont les mêmes
  • Rembourrage
  • Il ne peut pas y avoir de valeurs négatives ici, car Il est impossible de déplacer le contenu au-delà du cadre de l'élément. Les pourcentages sont calculés en fonction de la largeur du conteneur.
  • padding-top : valeur|%.

padding-right : valeur|%.

padding-bottom : valeur|%.

  • padding-left : valeur|%.
  • padding: padding-top padding-right padding-bottom padding-left - règle préfabriquée. Semblable à « marge ».
  • Bordures en CSS

Tous les cadres ont les caractéristiques suivantes :

  • Épaisseur - largeur de bordure : valeur (fin|moyen|épais). La valeur par défaut est moyenne.
  • Couleur - couleur de la bordure : couleur. La couleur par défaut est la couleur de la police dans cet élément.
  • Type - style de bordure : aucun|pointillé|tiret|solide|double|groove|ridge|inset|outset. Types : sans cadre | points | en pointillé | solide | double | imitation de relief.
  • Les règles du cadre elles-mêmes :
  • border-top-(largeur|couleur|style).

border-right- (largeur|couleur|style). border-bottom- (largeur|couleur|style). bordure-gauche- (largeur|couleur|style).

border : largeur de la bordure, style de bordure, couleur de la bordure. Règle d'équipe.

Propriété Bordure CSS;
  • Il permet de créer la bordure d'un objet, à savoir l'épaisseur du cadre, sa couleur et son style. Cette propriété est largement utilisée en HTML. Vous pouvez créer divers effets pour mieux percevoir le contenu de la page. Par exemple, concevez une barre latérale, un en-tête de site Web, un menu, etc.
  • 1. Syntaxe de bordure CSS frontière :
    • largeur de la bordure style de la bordure couleur de la bordure | hériter
    • border-width - épaisseur de la bordure. Vous pouvez le définir en pixels (px) ou utiliser les valeurs standards fin, moyen, épais (elles ne diffèrent que par la largeur en pixels)
    • border-style - style de la bordure affichée. Peut prendre
    • valeurs suivantes
    • aucun ou masqué - annule la bordure
    • pointillé - cadre en pointillés
    • pointillé - cadre composé de tirets
    • solide - ligne simple (le plus souvent utilisé)
  • double - double cadre rainure - bordure 3D rainurée crête, insert, début - divers effets de cadre 3D hériter - la valeur de l'élément parent est appliquée border-color - couleur de la bordure. Peut être réglé à l'aide
nom spécifique

couleurs ou en

Format RVB

(voir noms des couleurs html pour le site)

border-style: dashed
border-style: dashed
border-style: solid
border-style: double
border-style: groove
border-style: ridge
border-style: inset
border-style: outset

border-style: dotted

border-style: dashed

border-style: solid

border-style: double

border-style: groove

border-style: ridge

border-style: inset

border-style: outset

Четыре разных рамки

2.2. Пример. Изменения цвета рамки при наведении курсора мыши

Этот пример очень простой, но интересный. Он показывает, как можно использовать псевдокласс :hover и рамку CSS border для создания простых эффектов (например, для меню).

При наведении курсора мыши на блок цвет рамки изменится

Вот как это выглядит на странице:

2.3. Пример. Как сделать прозрачную рамку border

Рамку можно сделать прозрачной. Этот эффект редко, но иногда может быть очень полезен для веб-дизайнеров. Для задания прозрачности надо воспользоваться заданием цвета в виде RGBA (R, G, B, P) , где последним параметром задается прозрачность (вещественное число от 0.0 до 1.0)

Вот как это выглядит на странице:

3. Толщина границы: свойство border-width

Задает толщину линии. Ранее мы задавали ее в едином описании border.

Синтаксис CSS border-width

border-width : thin | medium | thick | значение ;
  • thin - тонкая толщина линии
  • medium - средняя толщина линии
  • thick - толстая толщина линии

Ниже приведены несколько примеров. Самым необычным будет - это разная толщина границы у каждой стороны.

border-width: thin
border-width: medium
border-width: thick
Разная толщина у границ

Вот как это выглядит на странице:

border-width: thin


border-width: medium


border-width: thick


Разная толщина у границ

4. Как сделать рамку border только с одного края (границы)

У свойства CSS border есть производные свойства для задания односторонних границ у элемента:

  • border-top - для задания рамки сверху (верхняя граница)
  • border-bottom - для задания рамки снизу (нижняя граница)
  • border-right - для задания рамки справа (правая граница)
  • border-left - для задания рамки слева (левая граница)

Эти границы можно совмещать, т.е. прописать для каждого направления свою рамку. Синтаксис точно такой же как и у border.

Также есть свойства

  • border-top-color - задание цвета верхний границы
  • border-top-style - задание стиля верхней границы
  • border-top-width - задание толщины верхней границы
  • и т.д. для каждого направления

На мой взгляд проще писать все в строчку, чем плодить лишний текст в стилях. Например, следующие свойства будут одинаковыми

/* Описание двух одинаковых стилей: */

4.1. Пример. Красивая рамка для выделения цитат

Пример рамки для цитаты

Вот как это выглядит на странице:

Пример рамки для цитаты

Примечание
Можно задать отдельную границу для каждой из сторон.

5. Как сделать несколько границ border у элемента html

Иногда требуется сделать несколько границ. Приведем пример

5.1. Первый вариант с несколькими границами

Вот как это выглядит на странице:

Есть второй способ через наложение теней.

5.2. Наложение теней для создания нескольких границ

Вот как это выглядит на странице:

6. Скругление углов у границ (border-radius)

Для создания красивых рамок используют свойство CSS border-radius (доступно только в CSS3). С помощью него можно делать скругления углов, что создает совсем другой вид. Например

7. Вдавленная линия CSS

Вдавленные линии эффектно могут смотреться на темном фоне, что подходит далеко не каждому сайту.


Вот как это выглядит на странице:

Для обращения к border из JavaScript нужно писать следующую конструкцию:

document.getElementById("elementID").style.border ="VALUE "

В этой главе:

Блочная модель - способ отображения элементов браузерами, которые обрабатывают все теги как небольшие блоки, для них любой тег - контейнер с содержимым: текстом, изображениями, другими тегами и т.д.

  • Margin (внешний отступ) - пустое пространство (поле), которое отделяет один элемент от другого. Самый простой пример внешнего отступа - промежуток между абзацами, идущими друг за другом. Область внешнего отступа прозрачна и не может иметь свой цвет и других эффектов оформления.
  • Border (рамка элемента) - граница с любой стороны элемента. Рамка может быть установлена как со всех сторон элемента, так и с одной стороны. Используя рамку можно просто красиво оформить элемент или визуально отделить содержимое текущего элемента от других элементов страницы.
  • Padding (внутренний отступ) - пустое пространство между содержимым элемента и его рамкой. Область внутреннего отступа прозрачна и не может иметь свой цвет или другие эффекты оформления.
  • У большинства элементов есть область содержимого, в которой располагается все содержимое элемента (текст, вставляемые изображения или другие элементы).

Рамка

Рамка представляет собой обычную линию, которая отображается вокруг стилизуемого элемента. Но совсем не обязательно применять рамку, окружающую элемент со всех сторон. Можно добавить ее только с требуемой строны элемента. Например, если добавить рамку только с нижней строны блочного элемента, то она будет производить тот же эффект, что и элемент


(горизонтальная линия), выступая в качестве разделителя.

Каждая рамка имеет три свойства, которыми мы можем управлять с помощью CSS: ширина, стиль и цвет, рассмотрим с помощью каких свойств можно их задавать и изменять:

Вместо указания всех трех свойств, можно указать всего одно - свойство border , которое позволяет одновременно указать ширину, стиль и цвет для рамки:

Название документа

Note

Les valeurs de la propriété CSS border peuvent être définies dans n'importe quel ordre. La séquence la plus couramment utilisée est la « couleur de style épaisseur ».

2. Exemples avec différentes bordures CSS



Pour contrôler le cadre séparément de chaque côté de l'élément, utilisez les propriétés suivantes :

  • bordure supérieure - cadre supérieur
  • bordure gauche - cadre gauche
  • bordure droite - cadre droit
  • bordure inférieure - cadre inférieur

Ces propriétés fonctionnent exactement de la même manière que la propriété border, sauf qu'elles vous permettent uniquement de contrôler la bordure d'un côté de l'élément que vous stylisez.

Marges extérieures et intérieures

Échancrure- espace vide entre le contenu de l'élément et sa bordure (s'il est installé). Pour ajouter et contrôler la largeur du remplissage sur les quatre côtés d'un élément, utilisez la propriété padding.

La marge est l'espace vide qui sépare un élément des autres éléments ou des bords de la fenêtre du navigateur. Pour ajouter et contrôler la largeur des marges sur les quatre côtés d'un élément, utilisez la propriété margin.

Les propriétés padding et margin peuvent prendre entre une et quatre valeurs :

Où les valeurs sont définies dans le sens des aiguilles d'une montre, en commençant par le haut :

Si vous spécifiez une seule valeur pour les propriétés, les retraits de tous les côtés auront la même largeur.

À première vue effet visible lorsque l'utilisation de ces propriétés se ressemble, pour remarquer une différence visuelle entre elles, vous pouvez, par exemple, définir une bordure pour l'élément ou définir arrière-plan:

Titre du document

Paragraphe régulier.



Pour les retraits, ainsi que pour les cadres, il existe des propriétés qui vous permettent de contrôler séparément la taille du retrait de chaque côté. Le remplissage est contrôlé par les propriétés suivantes : padding-top , padding-right , padding-bottom et padding-left . Les marges sont contrôlées par les propriétés suivantes : margin-top , margin-right , margin-bottom et margin-left .

Remarque : les valeurs des propriétés de remplissage et de marge ne sont pas héritées par les éléments enfants, vous devez donc spécifier les largeurs de remplissage séparément pour chaque élément qui les nécessite.

Largeur et hauteur de l'élément

Par défaut pour éléments de bloc la largeur automatique est utilisée. Cela signifie que l'élément sera étiré exactement autant qu'il l'est. espace libre. La hauteur par défaut des éléments de bloc est définie automatiquement, c'est-à-dire Le navigateur étend la zone de contenu verticalement afin que tout le contenu soit affiché. Pour définir des dimensions personnalisées pour la zone de contenu d'un élément, vous pouvez utiliser propriétés de largeur et la hauteur.

Les bordures sont les lignes qui entourent un élément (le contenu qu'il contient et le remplissage qui l'entoure). Un exemple que nous avons déjà rencontré est celui des cadres de cellules à l’intérieur d’un tableau.

CSS propose deux types de bordures : les bordures intérieures et les lignes extérieures. Propriétés CSS, responsable de la conception des cadres, commencent par le mot « frontière », qui peut être traduit par « Cadre », « Bordure ». La présence et le format du contour extérieur sont spécifiés par des propriétés commençant par le mot « contour ». Le contour, contrairement à la bordure, n’affecte pas la largeur et la position du bloc encadré. De plus, il ne peut pas être installé d’un seul côté, car frontière- seulement de tous les côtés à la fois.

Parlons d'abord de conception de frontière, alors passons à contour.

largeur de bordure

Définit la largeur de la bordure. Il est clair que par défaut l'élément est entouré de cadres sur quatre côtés. La propriété vous permet de définir la largeur des bordures soit la même pour tous les côtés, soit différente pour chaque côté. En fonction de la largeur à attribuer à quelles bordures, vous pouvez spécifier de une à quatre valeurs dans la règle.

Vous pouvez définir la largeur en utilisant les pixels, pourcentages et autres unités habituels Longueurs CSS, et mots réservés mince(2px), moyen(4px) et épais(6px).

Largeur de bordure : 16px 12px 4px 8px ;

style bordure

Définit le style de bordure. Notez que si vous ne définissez pas cette règle mais spécifiez la propriété largeur de bordure, alors il n'y aura aucune image du tout, donc si vous voulez limites visibles, n'oubliez pas d'indiquer style bordure.

Une propriété peut avoir de nombreuses valeurs, toutes sont clairement démontrées dans la figure ci-dessous.

Le dernier paragraphe montre que le style, comme l'épaisseur, du cadre de chaque côté peut être propre :

style de bordure : plein double pointillé aucun

couleur de la bordure

Fonctionne de la même manière que les propriétés précédentes, mais est responsable de la couleur des bordures. Vous pouvez également le définir entre une et quatre valeurs et vous connaissez déjà le résultat. Si la règle n'est pas définie, les cadres auront la couleur du texte de l'élément courant ou, si cela n'est pas spécifié, la couleur du texte de l'élément parent.

Couleur de la bordure : #C85EFA ;

frontière

Facilite l'écriture et enregistre le code en vous permettant de définir toutes les propriétés répertoriées pour les bordures de tous les côtés d'un élément sur une seule ligne :

P ( bordure : 2px vert uni ; )

Pour configurer différentes règles pour les frames avec différents côtés les valeurs suivantes peuvent être utilisées :

  • bordure supérieure- limite supérieure.
  • bordure droite- droite.
  • bordure inférieure- inférieur.
  • bordure gauche- gauche.

P ( bordure gauche : 6px pointillé jaune ; )

largeur du contour

Identique à largeur de bordure, uniquement pour le cadre extérieur, pas pour le cadre intérieur. Définit l'épaisseur du contour dans les mêmes valeurs que largeur de bordure. En plus de l'épaisseur du cadre de l'élément, vous devez préciser son style, sinon il n'y aura pas de contour.

style de contour

Valeurs de propriété valeurs en double style bordure. La règle spécifie le style du contour extérieur.

Comment optimiser les requêtes MySQL ?


Pour un site ordinaire, peu visité, il n'y a pas beaucoup de différence si les requêtes MySQL vers la base de données sont optimisées ou non. Mais pour les serveurs de production sous lourde charge la différence entre le SQL correct et le SQL incorrect est énorme et, au moment de l'exécution, ils peuvent avoir un impact significatif sur le comportement et la fiabilité des services. Dans cet article, je vais voir comment écrire des requêtes rapides et les facteurs qui les ralentissent.

Pourquoi MySQL ?

Aujourd’hui, on parle beaucoup de Dig Data et d’autres nouvelles technologies. Les solutions NoSQL et cloud sont excellentes, mais de nombreux logiciels populaires (tels que WordPress, phpBB, Drupal) fonctionnent toujours sur MySQL. Migration vers dernières solutions peut entraîner non seulement une modification de la configuration sur les serveurs. De plus, l'efficacité de MySQL est toujours au niveau, notamment la version Percona.

Ne commettez pas l'erreur courante d'utiliser de plus en plus de matériel pour résoudre le problème des requêtes lentes et charge élevée serveurs - il vaut mieux aller à la racine des problèmes. Augmentation de la puissance du processeur et disques durs et en ajoutant BÉLIER c'est aussi un certain type d'optimisation, cependant, ce n'est pas de cela dont nous parlerons dans cet article. De plus, en optimisant le site et en résolvant le problème matériel, la charge ne fera qu'augmenter de façon exponentielle. Il ne s’agit donc que d’une solution à court terme.

Une bonne compréhension de SQL est l'outil le plus important pour un développeur Web ; elle vous permettra d'optimiser et d'utiliser efficacement. bases de données relationnelles données. Dans cet article, nous nous concentrerons sur les populaires base de données ouverte données, souvent utilisées en conjonction avec PHP, et ceci est MySQL.

À qui s’adresse cet article ?

Pour les développeurs Web, les architectes et les développeurs de bases de données et administrateurs système, familier avec MySQL. Si vous n'avez jamais utilisé MySQL auparavant, cet article ne vous sera peut-être pas d'une grande utilité, mais j'essaierai quand même d'être aussi informatif et utile que possible, même pour ceux qui découvrent MySQL.

Sauvegarder d'abord

Je recommande de suivre les étapes suivantes en fonction de la base MySQL avec laquelle vous travaillez, mais assurez-vous de le faire copie de sauvegarde. Si vous ne disposez pas d'une base de données avec laquelle travailler, je vous fournirai des exemples pour créer votre propre base de données, le cas échéant.

Faire Sauvegardes MySQL simplement, en utilisant l'utilitaire mysqldump :

$ mysqldump myTab > myTab-backup.sql Vous pouvez en savoir plus sur mysqldump.

Qu’est-ce qui ralentit une requête ?

Ici liste générale facteurs affectant la vitesse d'exécution des requêtes et la charge du serveur :

  • index de tables ;
  • condition OÙ (et utilisation des données internes) Fonctions MySQL, par exemple, comme SI ou DATE) ;
  • trier par ORDER BY ;
  • répétition fréquente de demandes identiques ;
  • type de mécanisme de stockage de données (InnoDB, MyISAM, Memory, Blackhole) ;
  • ne pas utiliser la version Percona ;
  • configurations du serveur (my.cnf / my.ini) ;
  • sorties de données volumineuses (plus de 1 000 lignes) ;
  • connexion instable ;
  • configuration distribuée ou en cluster ;
  • Mauvaise conception de la table.
Nous aborderons ensuite toutes ces questions. Installez également Percona si vous n'utilisez pas déjà ce remplacement intégré MySQL standard- cela donnera une forte augmentation de la puissance de la base de données.

Que sont les index ?

Les index sont utilisés dans MySQL pour rechercher des lignes avec des valeurs de colonne spécifiées, comme avec la clause WHERE. Sans index, MySQL doit, en commençant par la première ligne, lire l'intégralité du tableau à la recherche des valeurs pertinentes. Plus la table est grande, plus les coûts sont élevés.

Si une table possède des index sur les colonnes qui seront utilisées dans la requête, MySQL trouvera rapidement les emplacements des informations dont il a besoin sans analyser la table entière. C'est beaucoup plus rapide que recherche séquentielle dans chaque ligne.

Connexion instable ?

Lorsque votre application se connecte à la base de données et est configurée connexion stable, il sera utilisé à chaque fois sans avoir à ouvrir une nouvelle connexion à chaque fois. Ce solution optimale pour l'environnement de travail.

Réduire la répétition fréquente de demandes identiques

Le moyen le plus rapide et le plus efficace que j'ai trouvé pour ce faire est de créer un stockage de requêtes et de leurs résultats à l'aide de Memcached ou Redis. Avec Memcache vous pouvez facilement mettre en cache le résultat de votre requête, par exemple comme ceci :

connecter("localhost",11211); $cacheResult = $cache->get("nom-clé"); if($cacheResult)( //pas besoin de requête $result = $cacheResult; ) else ( //exécutez votre requête $mysqli = mysqli("p:localhost","username","password","table" ); //ajouter p : pour le stockage à long terme $sql = "SELECT * FROM posts LEFT JOIN userInfo using (UID) WHERE posts.post_type = "post" || posts.post_type = "article" ORDER BY column LIMIT 50" ; $mysqli->query($sql); $memc->set("key-name", $result->fetch_array(), MEMCACHE_COMPRESSED,86400); //Mot de passe $cacheResult au modèle $template->assign(" messages", $cacheResult); ?> Désormais, une requête lourde utilisant LEFT JOIN ne sera exécutée qu'une fois toutes les 86 400 secondes (c'est-à-dire une fois par jour), ce qui réduira considérablement la charge. Serveur MySQL et laisser des ressources pour d’autres connexions.

Remarque : ajoutez p : au début de l'argument de l'hôte MySQLi pour créer une connexion persistante.

Configuration distribuée ou en cluster

Lorsque le volume de données augmente et que la vitesse de votre service diminue, la panique peut s'emparer de vous. Une solution rapide pourrait être la distribution des ressources (sharding). Cependant, je ne recommande pas de le faire à moins d'avoir bonne expérience, puisque la distribution rend intrinsèquement les structures de données complexes.

Conception de table faible

Créer des schémas de base de données n'est pas un travail difficile si vous suivez les règles d'or du travail avec des contraintes et si vous savez ce qui fonctionnera. Par exemple, stocker des images dans des cellules BLOB est très déroutant : stocker le chemin du fichier dans une cellule VARCHAR est une bien meilleure solution.

Garantir la bonne conception pour la bonne utilisation est primordial lors de la création de votre application. Stocker diverses données dans divers tableaux(par exemple, catégories et articles) et assurez-vous que les relations plusieurs à un et un à plusieurs peuvent être facilement associées aux identifiants. L'utilisation de FOREIGN KEY dans MySQL est idéale pour stocker des données en cascade dans des tables.

Lors de la création d'un tableau, n'oubliez pas ce qui suit :

  • Créez des tableaux efficaces pour résoudre vos problèmes, plutôt que de remplir les tableaux de données et de relations inutiles.
  • Ne vous attendez pas à ce que MySQL exécute votre logique métier ou votre programmation : les données doivent être prêtes à insérer votre ligne. langage de script. Par exemple, si vous devez trier une liste dans un ordre aléatoire, faites-le Tableau PHP sans utiliser ORDER BY de l'arsenal MySQL.
  • Utilisez les types d'index UNIQUE pour les ensembles de données uniques et utilisez ON DUPLICATE KEY UPDATE pour maintenir la date à jour, par exemple pour savoir quand une ligne était dans dernière fois modifié.
  • Utilisez le type de données INT pour stocker des entiers. Si vous ne spécifiez pas de taille de type de données, MySQL le fera pour vous.
Bases de l'optimisation

Pour optimiser efficacement, nous devons appliquer trois approches à votre application :

  1. Analyse (enregistrement des requêtes lentes, étude du système, analyse des requêtes et conception de la base de données)
  2. Exigences d'exécution (combien d'utilisateurs)
  3. Limites technologiques (vitesse du fer, abuser MySQL)
L'analyse peut être effectuée de plusieurs manières. Nous allons d’abord examiner les moyens les plus évidents de regarder sous le capot de votre MySQL où les requêtes sont en cours d’exécution. Le tout premier outil d’optimisation de votre arsenal est EXPLAIN. Si vous ajoutez cette instruction avant votre requête SELECT, le résultat de la requête ressemblera à ceci :

Colonnes, vous voyez, enregistrez informations importantes concernant la demande. Haut-parleurs auxquels vous devriez prêter attention la plus grande attention ce sont possible_keys et Extra.

La colonne possible_keys affichera les index auxquels MySQL avait accès pour exécuter la requête. Parfois, vous devez attribuer des index pour accélérer l’exécution de votre requête. La colonne Extra indiquera si un WHERE ou ORDER BY supplémentaire a été utilisé. La chose la plus importante à noter est de savoir si Using Filesort figure dans la sortie.

Ce que fait Using Filesort est indiqué dans l'aide de MySQL :

MySQL doit effectuer une passe supplémentaire pour comprendre comment renvoyer les lignes sous forme triée. Ce tri s'effectue en itérant sur toutes les lignes en fonction du type de jointure et en stockant la clé de tri et le pointeur de ligne pour toutes les lignes correspondantes. expression conditionnelle OÙ. Les clés sont triées et les lignes sont renvoyées dans le bon ordre.
Un laissez-passer supplémentaire ralentira votre candidature et doit être évité à tout prix. Un autre résultat critique d'Extra que nous devrions éviter est l'utilisation de temporaire. Il indique que MySQL a dû créer une table temporaire pour exécuter la requête. Évidemment, c'est une utilisation terrible de MySQL. Dans ce cas, le résultat de la requête doit être stocké dans Redis ou Memcache et ne plus être exécuté par les utilisateurs.

Pour éviter le problème lié à l'utilisation de Filesort, nous devons nous assurer que MySQL utilise INDEX. Il existe actuellement plusieurs clés spécifiées dans possible_keys parmi lesquelles choisir, mais MySQL ne peut sélectionner qu'un seul index pour la requête finale. De plus, les index peuvent être composés de plusieurs colonnes et vous pouvez également saisir des astuces pour l'optimiseur MySQL, pointant vers les index que vous avez créés.

Indication d'index

L'optimiseur MySQL utilisera des statistiques basées sur les requêtes de table pour sélectionner le meilleur index sur lequel exécuter la requête. Il fonctionne assez simplement, sur la base d'une logique statistique intégrée, donc ayant plusieurs options, cela ne fonctionne pas toujours bon choix sans l'aide d'indices. Pour vous assurer que la clé correcte (ou incorrecte) a été utilisée, utilisez les mots clés FORCE INDEX, USE INDEX et IGNORE INDEX dans votre requête. Vous pouvez en savoir plus sur les indications d'index dans l'aide de MySQL.

Pour afficher les clés du tableau, utilisez la commande SHOW INDEX. Vous pouvez spécifier plusieurs astuces à utiliser par l'optimiseur.

En plus de EXPLAIN, il existe le mot-clé DESCRIBE. Avec DESCRIBE, vous pouvez afficher les informations du tableau comme suit :

Ajout d'un index

Pour ajouter des index dans MySQL, vous devez utiliser la syntaxe CREATE INDEX. Il existe plusieurs types d'index. FULLTEXT est utilisé pour la recherche en texte intégral et UNIQUE est utilisé pour stocker des données uniques.

Pour ajouter un index à votre table, utilisez la syntaxe suivante :

Mysql> CREATE INDEX idx_bookname ON `books` (bookname(10)) ; Cela créera un index sur la table books qui utilisera les 10 premières lettres de la colonne qui stocke les titres de livres et qui est de type varchar. Dans ce cas, toute recherche avec une requête WHERE sur un titre de livre avec une correspondance allant jusqu'à 10 caractères produira le même résultat qu'une analyse de la table entière du début à la fin.

Indices composites

Les index ont un impact important sur la vitesse d'exécution des requêtes. Il ne suffit pas d'attribuer une clé principale unique - les clés composites constituent un véritable domaine d'application dans Configuration MySQL, ce qui nécessite parfois des tests A/B à l'aide d'EXPLAIN.

Par exemple, si nous devons référencer deux colonnes dans la condition d’une clause WHERE, une clé composite serait une solution idéale.

Mysql> CREATE INDEX idx_composite ON utilisateurs (nom d'utilisateur, actif) ; Une fois que nous avons créé une clé basée sur la colonne du nom d'utilisateur, qui stocke le nom d'utilisateur et les colonnes actives Type ENUM, qui détermine si son compte est actif. Désormais tout est optimisé pour une requête qui utilisera WHERE pour trouver un nom d'utilisateur valide avec un compte actif (actif = 1).

Quelle est la vitesse de votre MySQL ?

Activons le profilage pour examiner de plus près les requêtes MySQL. Cela peut être fait en faisant définir la commande profiling=1, après quoi, pour afficher le résultat, vous devez exécuter show profiles.

Si vous utilisez PDO, exécutez le code suivant :

$db->query("set profiling=1"); $db->query("sélectionnez le titre, le corps et les balises des publications"); $rs = $db->query("afficher les profils"); $db->query("set profiling=0"); // désactive le profilage après l'exécution de la requête $records = $rs->fetchAll(PDO::FETCH_ASSOC); // obtient les résultats du profilage $errmsg = $rs->errorInfo(); //Détectez quelques erreurs ici. La même chose peut être faite en utilisant mysqli :

$db = new mysqli($host,$username,$password,$dbname);

$db->query("set profiling=1"); $db->query("sélectionnez le titre, le corps et les balises des publications"); if ($result = $db->query("SHOW profiles", MYSQLI_USE_RESULT)) ( while ($row = $result->fetch_row()) ( var_dump($row); ) $result->close(); ) if ($result = $db->query("afficher le profil pour la requête 1", MYSQLI_USE_RESULT)) ( while ($row = $result->fetch_row()) ( var_dump($row); ) $result->close( ); ) $db->query("set profiling=0"); Cela vous renverra des données profilées contenant le temps d'exécution de la requête dans le deuxième élément du tableau associatif.

Array(3) ( => string(1) "1" => string(10) "0.00024300" => string(17) "sélectionner le titre, le corps, les balises des publications" ) Cette requête a pris 0,00024300 secondes. C'est assez rapide, alors ne nous inquiétez pas. Mais lorsque les chiffres deviennent importants, il faut regarder plus en profondeur. Accédez à votre application pour vous entraîner avec un exemple concret. Vérifiez la constante DEBUG dans la configuration de votre base de données, puis commencez à explorer le système en activant la sortie de profilage à l'aide des fonctions var_dump ou print_r. De cette façon, vous pouvez passer d'une page à l'autre dans votre application, obtenant ainsi un profilage pratique du système.

Audit complet de la base de données de votre site Internet

Pour activer la journalisation dans MySQL 5.1.6, utilisez la variable globale log_slow_queries, vous pouvez également marquer un fichier pour la journalisation à l'aide de la variable slow_query_log_file. Cela peut être fait en exécutant la requête suivante :

Définir global log_slow_queries = 1 ; définir global slow_query_log_file = /dev/slow_query.log ; Vous pouvez également le spécifier dans les fichiers de configuration /etc/my.cnf ou my.ini de votre serveur.

Après avoir apporté des modifications, n'oubliez pas de redémarrer le serveur MySQL avec la commande nécessaire, par exemple service mysql restart si vous utilisez Linux.

DANS Versions MySQL Après la version 5.6.1, la variable log_slow_queries est obsolète et slow_query_log est utilisée à la place. De plus, pour un débogage plus pratique, vous pouvez activer la sortie de table en définissant la variable log_output sur TABLE. Cependant, cette fonction n'est disponible que depuis MySQL 5.6.1.

Log_output = TABLE ; log_queries_not_using_indexes = 1 ; long_query_time = 1 ; La variable long_query_time spécifie le nombre de secondes après lequel la requête est considérée comme lente. La valeur est 10 et le minimum est 0. Vous pouvez également spécifier des millisecondes à l'aide d'une fraction ; maintenant j'ai indiqué une seconde. Et maintenant, chaque requête qui sera exécutée pendant plus d'une seconde est enregistrée dans les journaux du tableau.

La journalisation sera effectuée dans les tables mysql.slow_log et mysql.general_log de votre Bases de données MySQL données. Pour désactiver la journalisation, remplacez log_output par NONE.

Connexion sur un serveur de production

Sur un serveur de production qui dessert des clients, il est préférable de n'utiliser la journalisation que sur une courte période et de surveiller la charge afin de ne pas créer de charge inutile. Si votre service est surchargé et qu'une attention immédiate est nécessaire, essayez d'isoler le problème en exécutant SHOW PROCESSLIST ou en accédant à la table information_schema.PROCESSLIST en exécutant SELECT * FROM information_schema.PROCESSLIST;.

La journalisation de toutes les requêtes sur un serveur de production peut vous fournir beaucoup d'informations et constitue un bon outil à des fins de recherche lors de l'examen d'un projet, mais les journaux sur de longues périodes ne vous donneront pas beaucoup d'informations utiles par rapport aux journaux sur une période allant jusqu'à 48 heures. (essayez de surveiller les charges de pointe pour avoir une chance de mieux explorer l'exécution des requêtes).

Remarque : Si vous disposez d'un site qui connaît des vagues de trafic et parfois peu ou pas de trafic, comme un site de sport hors saison, utilisez ces informations pour créer et étudier la journalisation.

Enregistrer plusieurs demandes

Non seulement il est important d’être conscient des requêtes qui prennent plus d’une seconde à s’exécuter, mais vous devez également être conscient des requêtes qui sont exécutées des centaines de fois. Même si les requêtes sont exécutées rapidement, dans un système occupé, elles peuvent consommer toutes les ressources.

C'est pourquoi vous devez toujours être sur vos gardes après avoir apporté des modifications à un projet en direct : c'est le moment le plus critique pour le fonctionnement d'une base de données.

Cache chaud et froid

Le nombre de requêtes et la charge du serveur ont un fort impact sur l'exécution et peuvent également affecter le temps d'exécution des requêtes. Lors du développement, vous devez avoir pour règle que chaque requête ne prenne pas plus d'une fraction de milliseconde (0,0xx ou plus) sur un serveur gratuit.

L'utilisation de Memcache a un effet important sur la charge des serveurs et libérera des ressources qui exécutent les requêtes. Assurez-vous que vous utilisez Memcached efficacement et que vous avez testé votre application avec un cache chaud (données chargées) et un cache froid.

Pour éviter de fonctionner sur un serveur de production avec un cache vide, il est judicieux de disposer d'un script qui collecte tout le cache nécessaire avant de démarrer le serveur, afin qu'un afflux important de clients ne réduise pas le temps de démarrage du système.

Correction des requêtes lentes

Maintenant que la journalisation est configurée, vous avez peut-être trouvé des requêtes lentes sur votre site. Réparons-les ! À titre d'exemple, je vais montrer plusieurs problèmes courants et vous pourrez voir la logique pour les résoudre.

Si vous ne l'avez pas encore trouvé requête lente, vérifiez vos paramètres long_query_time si vous utilisez cette méthode de journalisation. Sinon, après avoir vérifié toutes vos requêtes de profilage (définir profiling=1), dressez une liste des requêtes qui prennent plus de temps qu'une fraction de milliseconde (0,000x secondes) et commencez à partir de là.

Problèmes courants

Voici les six problèmes les plus courants que j'ai rencontrés lors de l'optimisation des requêtes MySQL :

ORDER BY et tri de fichiers

Empêcher le tri de fichiers n'est parfois pas possible en raison de la clause ORDER BY. Pour l'optimisation, stockez le résultat dans Memcache ou effectuez un tri dans la logique de votre application.

Utilisation de ORDER BY avec WHERE et LEFT JOIN

ORDER BY rend les requêtes très lentes. Si possible, essayez de ne pas utiliser ORDER BY. Si vous avez besoin d'un tri, utilisez le tri par index.

Utilisation de ORDER BY sur des colonnes temporaires

Ne le fais pas. Si vous devez combiner les résultats, faites-le dans la logique de votre application ; N'utilisez pas de filtrage ou de tri sur la table temporaire de requête MySQL. Cela nécessite beaucoup de ressources.

Ignorer l'index FULLTEXT

Utiliser LIKE est la meilleure façon de faire recherche en texte intégral lent.

Choix déraisonnable grande quantité lignes

Oublier LIMIT dans votre requête peut augmenter considérablement le temps nécessaire à la récupération de la base de données, en fonction de la taille des tables.

Utilisation excessive de JOIN au lieu de créer des tables ou des vues composites

Lorsque vous utilisez plus de trois ou quatre opérateurs LEFT JOIN dans une seule requête, demandez-vous : est-ce que tout est correct ici ? Continuez sauf si vous avez une bonne raison, par exemple : la requête n'est pas souvent utilisée pour la sortie dans le panneau d'administration, ou le résultat de la sortie peut être mis en cache. Si vous devez exécuter une requête avec un grand nombre opérations de jointure de table, il est alors préférable de penser à créer des tables composites à partir des colonnes nécessaires ou à utiliser des vues.

Donc

Nous avons discuté des bases de l'optimisation et des outils nécessaires pour accomplir le travail. Nous avons examiné le système à l'aide du profilage et de l'instruction EXPLAIN pour voir ce qui se passait avec la base de données et comment nous pourrions améliorer la conception.

Nous avons également examiné quelques exemples et pièges classiques dans lesquels vous pouvez tomber lorsque vous utilisez MySQL. En utilisant les indices d'index, nous pouvons garantir que MySQL sélectionnera les index nécessaires, en particulier lorsque plusieurs sélections sont effectuées sur la même table. Pour continuer à étudier le sujet, je vous conseille de vous tourner vers le projet Percona.



Des questions ?

Signaler une faute de frappe

Texte qui sera envoyé à nos rédacteurs :