Vue d'ensemble de la stratégie d'optimisation MySQL, l'une des programmations de base de données PHP

Cet article décrit brièvement la stratégie d'optimisation MySQL de la programmation de base de données PHP. Partagez avec vous pour votre référence, comme suit:

J'ai vu il y a quelques jours un article qui disait que le goulot d'étranglement de PHP n'est pas dans PHP lui-même dans de nombreux cas, mais dans la base de données. Nous savons tous que dans le développement de PHP, l'ajout, la suppression, la modification et la vérification des données sont au cœur. Afin d'améliorer l'efficacité opérationnelle de PHP, les programmeurs doivent non seulement écrire un code logique et efficace, mais également être en mesure d'optimiser les instructions de requête. Bien que nous soyons impuissants dans la vitesse de lecture et d'écriture de la base de données, avec l'aide de certaines extensions de base de données comme memcache, mongodb, redis et d'autres serveurs de stockage de données, PHP peut également atteindre des vitesses d'accès plus rapides, alors comprenez et apprenez Ces extensions sont également très nécessaires.Cet article décrit d'abord les stratégies d'optimisation courantes de MySQL.

Cliquez ici pour rejoindre mon groupe de pingouins

Quelques astuces MySQL

1. Il est préférable d'écrire les mots-clés des instructions SQL en majuscules. Premièrement, il est facile de distinguer les mots-clés des objets d'opération. Deuxièmement, lorsque les instructions SQL sont exécutées, MySQL les convertit en majuscules. Les majuscules manuelles peuvent augmenter l'efficacité des requêtes ( Bien que petit).

2. Si nous ajoutons ou supprimons des lignes de données dans la base de données, l'ID de données sera trop volumineux. Utilisez- ALTER TABLE tablename AUTO_INCREMENT=Nle pour que l'ID d'auto-incrémentation compte à partir de N.

3, pour ajouter des ZEROFILLdonnées d'attribut de type int peuvent être automatiquement remplies 0

4. Lors de l'importation de grandes quantités de données, il est préférable de supprimer d'abord l'index, d'insérer les données, puis d'ajouter l'index, sinon, mysql passera beaucoup de temps à mettre à jour l'index.

5. Lors de la création d'une base de données pour écrire des instructions sql, nous pouvons créer un fichier avec un suffixe .sql dans l'EDI. L'EDI reconnaîtra la syntaxe sql, ce qui facilitera l'écriture. Plus important encore, si votre base de données est perdue, vous pouvez toujours trouver ce fichier et l'utiliser dans le répertoire courant /path/mysql -uusername -ppassword databasename < filename.sqlpour exécuter l'instruction sql de l'ensemble du fichier (notez que -u et -p sont suivis du nom d'utilisateur et du mot de passe, sans espaces).

Optimisation de la conception de bases de données

1. La conception de la base de données est conforme au troisième paradigme et il peut y avoir une certaine quantité de redondance des données pour faciliter les requêtes.

2. Sélectionnez le type de données priorité int> date, heure> enum, char> varchar> blob. Lors de la sélection du type de données, pensez à le remplacer. Par exemple, l'adresse IP peut être convertie en type int unsign avec la fonction ip2long () pour le stockage.

3. Pour le type char (n), la valeur de n doit être aussi petite que possible lorsque les données sont complètes.

4. L'utilisation de la commande partition pour partitionner une seule table lors de la création d'une table peut grandement améliorer l'efficacité des requêtes. MySQL prend en charge les types de partition RANGE, LIST, HASH et KEY. Parmi eux, RANGE est la plus couramment utilisée. La méthode de partitionnement est la suivante:

CREATE TABLE tablename{
    
    
}ENGINE innodb/myisam CHARSET utf8 //选择数据库引擎和编码
PARTITION BY RANGE/LIST(column),//按范围和预定义列表进行分区
PARTITION partname VALUES LESS THAN /IN(n),//命名分区并详细限定分区的范围

5. Faites attention à la différence entre innodb et myisam lors du choix d'un moteur de base de données.

Structure de stockage : MyISAM est stocké sous forme de trois fichiers sur le disque. Toutes les tables InnoDB sont stockées dans le même fichier de données, généralement 2 Go

Prise en charge des transactions : MyISAM ne fournit pas de prise en charge des transactions. InnoDB fournit des transactions de support de transaction.

Différence de verrouillage de table : MyISAM ne prend en charge que les verrous de niveau table. InnoDB prend en charge les transactions et les verrous au niveau des lignes.

Indexation de texte intégral : MyISAM prend en charge l' indexation de texte intégral de type FULLTEXT (non applicable au chinois, utilisez donc le moteur d'indexation de texte intégral sphinx). InnoDB ne prend pas en charge.

Le nombre spécifique de lignes dans la table : MyISAM enregistre le nombre total de lignes dans la table et le nombre de requêtes (*) est rapide. InnoDB n'enregistre pas le nombre total de lignes du tableau et doit être recalculé.

Clé étrangère : MyISAM ne prend pas en charge. Prise en charge d'InnoDB

Optimisation d'index

1. Innodb est un index clusterisé. Lors du stockage de l'index, il doit y avoir une clé primaire. Si elle n'est pas spécifiée, le moteur générera automatiquement une clé primaire masquée et générera un index primaire. L'adresse physique de la clé primaire est stockée dans l'index. Les données sont stockées par la clé primaire. Lorsque vous utilisez l'index, recherchez d'abord l'index principal, puis recherchez les données sous l'index principal.

L'avantage est que la recherche via la clé primaire est très rapide, mais l' inconvénient est que l'index secondaire sera lent, car il est nécessaire de trouver l'index primaire via l'index secondaire (la position de l'index primaire dans l'index secondaire.), Puis de rechercher les données via l'index primaire. Et si la clé primaire est irrégulière, davantage de blocs de données doivent être déplacés lors de l'insertion d'une nouvelle valeur, ce qui affectera l'efficacité, essayez donc d'utiliser un type int qui augmente régulièrement comme clé primaire. De plus, comme les données sont placées immédiatement après la clé primaire, s'il y a des colonnes (texte / blob) avec une quantité particulièrement grande de données dans les données, les requêtes innodb ignoreront de nombreux blocs de données, ce qui entraînera également de la lenteur.

2. Les index de myisam sont tous identiques et pointent uniformément vers l'adresse de chaque ligne sur le disque, et ce sont tous des données de pointeur léger. L'inconvénient est que l'établissement de chaque index ne se fait pas via la clé primaire et que la requête n'est pas aussi rapide que l'index cluster pour trouver la clé primaire. Mais comme il stocke l'adresse, la comparaison change lors de l'insertion d'une nouvelle valeur.

3. Lors de l'exécution de requêtes à conditions multiples, lors de la création d'index pour plusieurs conditions séparément, lors de l'exécution de requêtes SQL, MySQL ne sélectionnera que l'index le plus proche à utiliser, donc si vous avez besoin de requêtes à conditions multiples, créez un index conjoint, même si cela entraînera une redondance des données Plus.

Méthode d'établissement BTREE de l'index conjoint : indexez la première condition, indexez la deuxième condition dans la zone BTREE du premier index, et ainsi de suite, donc lorsque vous utilisez l'index, n'utilisez pas la première condition et utilisez la seconde Cette condition n'utilisera pas l'index conjoint. Lors de l'utilisation de l'index, les conditions doivent être ordonnées et utilisées dans l'ordre.

4. La longueur de l'index a également une grande influence sur la requête. Nous devrions essayer de créer une longueur d'index courte. Nous pouvons utiliser la colonne de requête
SELECT COUNT (DISTINCT LEFT (colonne)) / COUNT (*) FROM nomtable pour tester la sélection lors de l'indexation de la colonne de colonne Différentes longueurs, quelle que soit la couverture de l'index, nous choisissons n longueurs proches de la saturation pour créer un index
ALTER TABLE tablename ADD INDEX (column (n)); pour indexer les n premiers caractères d'une colonne. Si les n premiers caractères sont identiques, nous pouvons même inverser le stockage de la chaîne et ensuite construire un index.

5. La méthode de maintenance pour la fragmentation d'index causée par des modifications fréquentes: ALTER TABLE tablename ENGINE oldengine, c'est-à-dire, appliquez à nouveau le moteur de stockage de table pour le maintenir automatiquement, vous pouvez également utiliser la commande OPTIMIZE tablename pour la maintenance.

Optimisation des requêtes de données

Essayez de minimiser les opérations de base de données et essayez de ne pas effectuer d'opérations sur les données au niveau de la base de données lorsqu'il y a des requêtes, mais revenez au script PHP pour manipuler les données afin de réduire la pression de la base de données.

Une fois qu'un problème de performances de base de données est découvert, il doit être résolu à temps. En règle générale, les journaux de requêtes lentes sont utilisés pour enregistrer les requêtes "lentes", EXPLAIN est utilisé pour analyser l'utilisation des requêtes et des index, et PROFILE est utilisé pour analyser la consommation de ressources spécifiques lors de l'exécution de l'instruction.

Journal de requêtes lent:

1. Ajouter sous [mysqld] dans my.ini ou my.cnf

  • slow_query_log_file = / path // Définit le chemin de stockage du journal

  • long_query_time = n // Défini si le temps d'exécution de l'instruction atteint n secondes, il sera enregistré

2. Ensuite, définissez SET slow_query_log = 'ON' dans MySQL pour activer les requêtes lentes.

3. Après avoir enregistré le journal, nous utilisons le nom de fichier mysqldumpslow dans le répertoire / bin / pour afficher le journal. Les paramètres communs sont les suivants:

  • -g modèle utilise des expressions régulières

  • -tn renvoie les n premières données

  • -sc / t / l / r trier par heure d'enregistrement / heure / heure de la requête / numéro d'enregistrement retourné

Déclaration EXPLAIN

Comment l'utiliser, ajoutez EXPLAIN avant l'instruction de requête à exécuter

EXPLAIN SELECT * FROM user;

Le résultat est le suivant:

Insérez la description de l'image ici

Ce qui suit est une explication de chaque élément:

id L'ID de l' instruction de requête. Une requête simple n'a pas de sens et l'ordre d'exécution de la requête peut être vu dans plusieurs requêtes.

Le type d'instruction de requête exécutée par select-type correspond à plusieurs requêtes, telles que simple / primaire / union.

Tabel instruction de requête table de données de requête

type Le type de données obtenues, l'efficacité de type commun de haut en bas est nulle> const> eq_ref> ref> range> index> all

possible-keys : index possibles

Index utilisé par clé

longueur d'index key_len

Quelle colonne ref utilise avec l'index pour sélectionner dans la table.

Rows trouve le nombre approximatif de lignes de données à analyser, vous pouvez voir les avantages et les inconvénients de l'index

Les plus courants sont

Utilisez filesort pour trier les fichiers après avoir interrogé les données, ce qui est plus lent et doit optimiser l'index

en utilisant where lit la ligne entière de données, puis évalue et filtre si elle répond aux conditions where

En utilisant la couverture d' index d' index, c'est-à-dire que les données cibles sont déjà stockées dans la traction et que l'index est lu directement, très rapidement.

PROFIL

Utilisez SELECT @@ frofiling pour afficher l'état actif de PROFILE.

S'il n'est pas activé, utilisez SET profiling = 1 pour l'activer.

Après avoir ouvert, puis exécuté l'instruction de requête, MySQL enregistrera automatiquement les informations de profil.

Utilisez show profiles pour afficher toutes les informations SQL, le résultat est Query_ID Duration Query trois colonnes de résultats, qui sont l'ID de requête, le temps passé et l'instruction SQL utilisée.

On peut utiliser

SHOW PFROFILE [type[,type]][FOR QUREY Query_ID][Limit rwo_count [OFFSET offset]]

Les types courants incluent ALL (tous), BLOCK IO (affichage de la surcharge liée aux E / S), CPU (surcharge du processeur), MEMORY (surcharge de la mémoire), etc.

Optimisé pour un grand stockage

Réplication de base de données maître-esclave et séparation en lecture-écriture

1. Le maître enregistre les modifications dans le journal binaire, et l'esclave copie le binaire du maître dans son journal de relais, puis renvoie les données dans ses propres données pour atteindre l'objectif de copier les données du serveur maître.

La réplication maître-esclave peut être utilisée pour: l'équilibrage de la charge de la base de données, la sauvegarde de la base de données, la séparation lecture-écriture et d'autres fonctions.

2. Configurez le maître du serveur maître

修改my.ini/my.conf

[mysqld]

log-bin=mysql-bin //启用二进制日志

server-id=102 //服务器唯一ID

3. Configurer l'esclave

log-bin=mysql-bin //启用二进制日志

server-id=226 //服务器唯一ID

4. Autorisez le serveur esclave sur le serveur maître

GRANT REPLICATION SLAVE ON *.* to 'slavename'@'IP' identified by 'root'

5. Utilisation sur le serveur esclave

change master to 
master_host="masterip",
master_user="masteruser",
master_password="masterpasswd";

6. Utilisez ensuite la commande start slave pour démarrer la réplication maître-esclave.

N'oubliez pas de redémarrer le serveur après chaque modification de configuration, puis vous pouvez utiliser show master / slave status pour afficher l'état du maître / esclave sur le serveur maître-esclave.

La réalisation de la séparation lecture-écriture de la base de données dépend du middleware MySQL, tel que mysql_proxy, atlas, etc. En configurant ces middlewares pour séparer les serveurs maître et esclave pour la lecture et l'écriture, le serveur esclave assume la responsabilité de la lecture, réduisant ainsi la charge du serveur maître.

Partage de base de données

Lorsque la quantité de données dans la table de données de la base de données est très importante, qu'il s'agisse de la pression de l'indexation ou de la mise en cache, etc., la base de données est fragmentée pour être stockée dans plusieurs serveurs de base de données ou plusieurs tables afin de réduire la pression des requêtes.

Il existe une segmentation verticale, une segmentation horizontale et une segmentation combinée .

Segmentation verticale : Lorsqu'il y a beaucoup de tables de données, divisez les tables de la base de données qui sont étroitement liées (comme le même module, souvent connecté et interrogé) et placez-les sur différents serveurs maîtres et esclaves.

Segmentation horizontale : Lorsqu'il n'y a pas beaucoup de tables et que la quantité de données dans la table est très grande, afin d'accélérer la requête, des algorithmes tels que le hachage peuvent être utilisés pour diviser une table de données en plusieurs et les placer sur différents serveurs pour accélérer la requête . La différence entre le partitionnement horizontal et le partitionnement de la table de données réside dans son support de stockage.

Segmentation conjointe : dans la plupart des cas, la quantité de données dans la table de données et la table est très grande, puis une segmentation conjointe est nécessaire, c'est-à-dire que les divisions de table verticales et horizontales sont effectuées en même temps et la base de données est divisée en une matrice distribuée pour le stockage.

Chacune de ces méthodes d'optimisation de base de données peut être utilisée pour rédiger un article, qui peut être décrit comme détaillé et approfondi. Après avoir compris et mémorisé ces méthodes, vous pouvez sélectionner et optimiser de manière ciblée si nécessaire pour atteindre une efficacité élevée de la base de données.

Faites attention, ne vous perdez pas

Très bien, tout le monde, ce qui précède est tout le contenu de cet article. Les personnes qui peuvent voir ici sont tous des talents . Comme je l'ai déjà dit, il y a beaucoup de points techniques en PHP, car il y en a trop, c'est vraiment impossible d'écrire, et vous ne lirez pas trop après l'avoir écrit, donc je vais l'organiser en PDF et documents ici, si nécessaire Pouvez

Cliquez pour saisir le code secret: PHP + 「Plateforme」

Insérez la description de l'image ici

Insérez la description de l'image ici


Pour plus de contenu d'apprentissage, veuillez visiter le [Comparative Standards Factory] Excellent catalogue de tutoriels PHP Architect, tant que vous pouvez le lire pour vous assurer que le salaire augmentera d'un cran (mise à jour continue)

Le contenu ci-dessus espère aider tout le monde . De nombreux utilisateurs de PHP rencontrent toujours des problèmes et des goulots d'étranglement lorsqu'ils sont avancés. Il n'y a pas de sens de l'orientation lorsque vous écrivez trop de code métier. Je ne sais pas par où commencer pour m'améliorer. J'ai compilé des informations à ce sujet, notamment Mais sans s'y limiter: architecture distribuée, haute évolutivité, hautes performances, haute concurrence, réglage des performances du serveur, TP6, laravel, YII2, Redis, Swoole, Swoft, Kafka, optimisation Mysql, scripts shell, Docker, microservices, Nginx, etc. De nombreux points de connaissances, des produits secs avancés avancés, peuvent être partagés avec tout le monde gratuitement, et ceux nécessaires peuvent rejoindre mon groupe d'échange de technologie PHP

Je suppose que tu aimes

Origine blog.csdn.net/weixin_49163826/article/details/109265778
conseillé
Classement