Maison  >  Article  >  base de données  >  Résumé de quelques méthodes d'optimisation MySQL couramment utilisées

Résumé de quelques méthodes d'optimisation MySQL couramment utilisées

伊谢尔伦
伊谢尔伦original
2017-07-17 15:35:522196parcourir

1. Sélectionnez les attributs de champ les plus applicables

MySQL peut bien prendre en charge l'accès à de grandes quantités de données, mais de manière générale, plus la table est petite , plus les requêtes exécutées dessus seront rapides. Par conséquent, lors de la création d’un tableau, afin d’obtenir de meilleures performances, nous pouvons définir la largeur des champs du tableau aussi petite que possible. Par exemple, lors de la définition du champ du code postal, si vous le définissez sur CHAR(255), cela ajoutera évidemment de l'espace inutile à la base de données. Même l'utilisation du type VARCHAR est redondante, car CHAR(6) est une bonne mission accomplie. De même, si possible, nous devrions utiliser MEDIUMINT au lieu de BIGIN pour définir des champs entiers.
Une autre façon d'améliorer l'efficacité consiste à définir les champs sur NOT NULL lorsque cela est possible, afin que la base de données n'ait pas besoin de comparer les valeurs NULL lors de l'exécution de requêtes ultérieures.
Pour certains champs de texte, comme « province » ou « sexe », nous pouvons les définir comme de type ENUM. Parce que dans MySQL, le type ENUM est traité comme des données numériques et les données numériques sont traitées beaucoup plus rapidement que les types texte. De cette façon, nous pouvons améliorer les performances de la base de données.
2. Utilisez des jointures (JOIN) au lieu de sous-requêtes (Sous-requêtes)
MySQL prend en charge les sous-requêtes SQL à partir de la version 4.1. Cette technique vous permet d'utiliser une instruction SELECT pour créer une seule colonne de résultats de requête, puis d'utiliser ce résultat comme condition de filtre dans une autre requête. Par exemple, si nous souhaitons supprimer les clients qui n'ont aucune commande dans la table d'informations client de base, nous pouvons utiliser une sous-requête pour récupérer d'abord les identifiants de tous les clients qui ont émis des commandes à partir de la table d'informations sur les ventes, puis transmettre les résultats à la requête principale, comme indiqué ci-dessous :

DELETE FROM customerinfo WHERE CustomerID NOT in (SELECT CustomerID FROM salesinfo )

L'utilisation de sous-requêtes peut effectuer de nombreuses opérations SQL qui nécessitent logiquement plusieurs étapes pour être exécutées en même temps, et peut également éviter des transactions ou verrous de table. Et c’est facile à écrire. Cependant, dans certains cas, les sous-requêtes peuvent être remplacées par des jointures plus efficaces (JOIN). Par exemple, supposons que nous souhaitions récupérer tous les utilisateurs qui n'ont pas d'enregistrement de commande, nous pouvons utiliser la requête suivante pour le compléter :

SELECT * FROM customerinfo WHERE CustomerID NOT in (SELECT CustomerID FROM salesinfo )

Si vous utilisez une connexion (JOIN)... pour terminer cette requête, la vitesse sera beaucoup plus rapide. Surtout lorsqu'il y a un index pour CustomerID dans la table salesinfo, les performances seront meilleures. La requête est la suivante :

SELECT * FROM customerinfo LEFT JOIN salesinfoON customerinfo.CustomerID=salesinfo. CustomerID WHERE salesinfo.CustomerID IS NULL

Join (JOIN).. Le raison pour laquelle c'est plus C'est plus efficace car MySQL n'a pas besoin de créer une table temporaire en mémoire pour terminer cette requête logique en deux étapes.
3. Utilisez l'union (UNION) pour remplacer les tables temporaires créées manuellement
MySQL prend en charge la requête UNION à partir de la version 4.0, qui peut combiner deux données ou plus nécessitant l'utilisation de requêtes SELECT de tables temporaires. sont fusionnés en une seule requête. À la fin de la session de requête du client, la table temporaire sera automatiquement supprimée pour garantir que la base de données est ordonnée et efficace. Lorsque vous utilisez UNION pour créer une requête, nous devons uniquement utiliser UNION comme mot-clé pour connecter plusieurs instructions SELECT. Il convient de noter que le nombre de champs dans toutes les instructions SELECT doit être le même. L'exemple suivant illustre une requête utilisant UNION.

SELECT Name, Phone FROM client UNION SELECT Name, BirthDate FROM author 
UNION 
SELECT Name, Supplier FROM product

4. Verrouillage des tables
Bien que les transactions soient un très bon moyen de maintenir l'intégrité de la base de données, en raison de leur exclusivité, elles affectent parfois les performances de la base de données. , en particulier dans les grands systèmes d'applications. Étant donné que la base de données sera verrouillée lors de l'exécution de la transaction, les autres demandes des utilisateurs ne pourront qu'attendre la fin de la transaction. Si un système de base de données n'est utilisé que par quelques utilisateurs
, l'impact des transactions ne deviendra pas un gros problème, mais supposons que des milliers d'utilisateurs accèdent à un système de base de données en même temps, par exemple en accédant à un site Web de commerce électronique ; , Cela entraînera un retard de réponse important.
En fait, dans certains cas, nous pouvons obtenir de meilleures performances en verrouillant la table. L'exemple suivant utilise la méthode de table de verrouillage pour terminer la fonction de transaction dans l'exemple précédent.

LOCK TABLE inventory WRITE 
SELECT Quantity FROM inventory 
WHEREItem='book'; 
... 
UPDATE inventory SET Quantity=11 
WHEREItem='book'; 
UNLOCK TABLES

Ici, nous utilisons une instruction SELECT pour obtenir les données initiales, via quelques calculs, et utilisons une instruction UPDATE pour mettre à jour les nouvelles valeurs dans le tableau. L'instruction LOCK TABLE contenant le mot clé WRITE garantit qu'il n'y aura aucun autre accès à l'inventaire à insérer, mettre à jour ou supprimer avant l'exécution de la commande UNLOCK TABLES.
5. Utilisation de clés étrangères
La méthode de verrouillage de la table peut maintenir l'intégrité des données, mais elle ne peut pas garantir la pertinence des données. A ce stade, nous pouvons utiliser des clés étrangères. Par exemple, une clé étrangère peut garantir que chaque enregistrement de vente pointe vers un client existant. Ici, la clé étrangère peut mapper le CustomerID de la table customerinfo au CustomerID de la table salesinfo. Tout enregistrement sans CustomerID valide ne sera pas mis à jour ou inséré dans salesinfo.

CREATE TABLE customerinfo 
( 
CustomerID INT NOT NULL , 
PRIMARY KEY ( CustomerID ) 
) TYPE = INNODB; 
CREATE TABLE salesinfo 
( 
SalesID INT NOT NULL, 
CustomerID INT NOT NULL, 
PRIMARY KEY(CustomerID, SalesID), 
FOREIGN KEY (CustomerID) REFERENCES customerinfo 
(CustomerID) ON DELETECASCADE 
) TYPE = INNODB;

注意例子中的参数“ON DELETE CASCADE”。该参数保证当 customerinfo 表中的一条客户记录被删除的时候,salesinfo 表中所有与该客户相关的记录也会被自动删除。如果要在 MySQL 中使用外键,一定要记住在创建表的时候将表的类型定义为事务安全表 InnoDB类型。该类型不是 MySQL 表的默认类型。定义的方法是在 CREATE TABLE 语句中加上 TYPE=INNODB。如例中所示。
6、使用索引
索引是提高数据库性能的常用方法,它可以令数据库服务器以比没有索引快得多的速度检索特定的行,尤其是在查询语句当中包含有MAX(), MIN()和ORDERBY这些命令的时候,性能提高更为明显。那该对哪些字段建立索引呢?一般说来,索引应建立在那些将用于JOIN, WHERE判断和ORDER BY排序的字段上。尽量不要对数据库中某个含有大量重复的值的字段建立索引。对于一个ENUM类型的字段来说,出现大量重复值是很有可能的情况,例如 customerinfo中的“province”.. 字段,在这样的字段上建立索引将不会有什么帮助;相反,还有可能降低数据库的性能。我们在创建表的时候可以同时创建合适的索引,也可以使用ALTER TABLE或CREATE INDEX在以后创建索引。此外,MySQL
从版本3.23.23开始支持全文索引和搜索。全文索引在MySQL 中是一个FULLTEXT类型索引,但仅能用于MyISAM 类型的表。对于一个大的数据库,将数据装载到一个没有FULLTEXT索引的表中,然后再使用ALTER TABLE或CREATE INDEX创建索引,将是非常快的。但如果将数据装载到一个已经有FULLTEXT索引的表中,执行过程将会非常慢。
7、优化的查询语句
绝大多数情况下,使用索引可以提高查询的速度,但如果SQL语句使用不恰当的话,索引将无法发挥它应有的作用。下面是应该注意的几个方面。首先,最好是在相同类型的字段间进行比较的操作。在MySQL 3.23版之前,这甚至是一个必须的条件。例如不能将一个建有索引的INT字段和BIGINT字段进行比较;但是作为特殊的情况,在CHAR类型的字段和 VARCHAR类型字段的字段大小相同的时候,可以将它们进行比较。其次,在建有索引的字段上尽量不要使用函数进行操作。
例如,在一个DATE类型的字段上使用YEAE()函数时,将会使索引不能发挥应有的作用。所以,下面的两个查询虽然返回的结果一样,但后者要比前者快得多。

SELECT * FROM order WHERE YEAR(OrderDate)<2021; 
SELECT * FROM order WHERE OrderDate<"2021-01-01";

同样的情形也会发生在对数值型字段进行计算的时候:

SELECT * FROM inventory WHERE Amount/7<24; 
SELECT * FROM inventory WHERE Amount<24*7;

上面的两个查询也是返回相同的结果,但后面的查询将比前面的一个快很多。第三,在搜索字符型字段时,我们有时会使用 LIKE 关键字和通配符,这种做法虽然简单,但却也是以牺牲系统性能为代价的。例如下面的查询将会比较表中的每一条记录。

SELECT * FROM books 
WHERE name like "MySQL%"

但是如果换用下面的查询,返回的结果一样,但速度就要快上很多:

SELECT * FROM books 
WHERE name>="MySQL"and name<"MySQM"

最后,应该注意避免在查询中让MySQL进行自动类型转换,因为转换过程也会使索引变得不起作用。

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