Maison > base de données > tutoriel mysql > Comment pouvons-nous optimiser une requête MySQL SELECT lente pour améliorer les performances des pages Web ?

Comment pouvons-nous optimiser une requête MySQL SELECT lente pour améliorer les performances des pages Web ?

Linda Hamilton
Libérer: 2024-12-30 08:39:14
original
518 Les gens l'ont consulté

How Can We Optimize a Slow MySQL SELECT Query to Improve Web Page Performance?

Requête de sélection MySQL lente optimisée pour améliorer les performances

Cette requête MySQL a connu des retards en raison de sa complexité et de son volume de données. Pour atténuer cela, il est essentiel de comprendre les relations entre les tables impliquées :

  • poster_data : Stocke les données sur les affiches individuelles.
  • poster_categories : Répertorie toutes les catégories disponibles (par exemple, films, art).
  • poster_prodcat : Lie les affiches à leurs catégories respectives, avec plusieurs entrées possibles pour une seule affiche.

La requête originale, comme suit, est exposée un temps d'exécution long, notamment lorsqu'il est utilisé dans la création de pages web :

SELECT * 
FROM poster_prodcat, 
     poster_data, 
     poster_categories 
WHERE poster_data.apnumber = poster_prodcat.apnumber 
AND poster_categories.apcatnum = poster_prodcat.apcatnum 
AND poster_prodcat.apcatnum='623'  
ORDER BY aptitle ASC 
LIMIT 0, 32
Copier après la connexion

Analyse de l'exécution Plan :

Le goulot d'étranglement des performances de la requête a été identifié dans la sortie « explain » :

[Explain Image Link]

Comme observé, la requête devait écrire des données sur le disque, ce qui a un impact significatif sur la vitesse.

Solution :

Pour Pour résoudre ce problème, un schéma révisé a été conçu à l'aide de l'indexation composite. Cette nouvelle structure a démontré des améliorations significatives des performances :

DROP TABLE IF EXISTS poster;
CREATE TABLE poster
(
poster_id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL UNIQUE
)
ENGINE = INNODB; 

DROP TABLE IF EXISTS category;
CREATE TABLE category
(
cat_id MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL UNIQUE
)
ENGINE = INNODB; 

DROP TABLE IF EXISTS poster_category;
CREATE TABLE poster_category
(
cat_id MEDIUMINT UNSIGNED NOT NULL,
poster_id INT UNSIGNED NOT NULL,
PRIMARY KEY (cat_id, poster_id) -- Note the clustered composite index !!
)
ENGINE = INNODB;
Copier après la connexion

Avec l'index composite en place, la requête révisée suivante a produit des résultats ultra-rapides :

SELECT
p.*,
c.*
FROM
poster_category pc
INNER JOIN category c ON pc.cat_id = c.cat_id
INNER JOIN poster p ON pc.poster_id = p.poster_id
WHERE
pc.cat_id = 623
ORDER BY
p.name
LIMIT 32;
Copier après la connexion

Cette approche optimisée a résolu efficacement le problème problèmes de performances, rendant la page Web de l'application réactive et conviviale.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal