Maison >base de données >tutoriel mysql >Résumer les opérations les plus élémentaires de l'optimisation MySQL
Les étapes détaillées d'optimisation de MySQL sont les suivantes :
Parce que lors de la création d'une table, si vous ne définissez pas de valeur par défaut pour la valeur créée, MySQL définira la valeur par défaut sur NULL
. Alors pourquoi n'est-il pas bon d'utiliser NULL
? NULL
。那么为啥用NULL
不好呢?
NULL
使得索引维护更加复杂,强烈建议对索引列设置NOT NULL
NOT IN
、!=
等负向条件查询在有NULL
值的情况下返回永远为空结果,查询容易出错NULL
列需要一个额外字节作为判断是否为NULL
的标志位NULL
时和该列其他的值可能不是同种类型,导致问题。(在不同的语言中表现不一样)NULL
的列的查询所以对于那些以前偷懒的字段,手动设置一个默认值吧,空字符串呀,0呀补上。
虽然这种方法对于MySQL的性能来说没有提升多少,但是这是一个好习惯,而且以小见大,不要忽略这些细节。
对于经常查询的字段,请加上索引,有索引和没有索引的查询速度相差十倍甚至更多。
id
字段varchar
类型的字段,在建立索引的时候,最好指定长度LIKE
条件这样的模糊搜索对于字段索引是无效的,需要另外建立关键词索引来解决当表和表之间有约束时,虽然增删查的SQL语句变简单了,但是带来的负面效果是插入等操作数据库都会去检查约束(虽然可以手动设置忽略约束),这样相当于把一些业务逻辑写到了数据库层,不便于维护。
数据库中那些可以用整形表示的数据就不要使用字符串类型,到底是用varchar
还是char
要看字段的可能值。
这种优化往往在数据库中有大量数据以后是不可行的,最好在数据库设计之前就设计好。
tinyint
代替VARCHAR
,ENUM
呢?ENUM
扩展困难,比如后来移动平台又增加了一个ipad
,那岂不是懵逼了,而tinyint
加个2就行,而且ENUM
在代码里面处理起来特别奇怪,是当成整形呢还是字符串,各个语言不一样。char
,比如邮编,总是5位varchar
bigint
,比如记录文章数目的表id
字段,用int
就行了,21亿篇文章上限够了查询的时候,肯定int
类型比varchar
NULL
rend la maintenance de l'index plus compliquée. Il est fortement recommandé de définir NOT NULL
pour les colonnes d'index
NOT IN
, . != et les autres requêtes conditionnelles négatives renverront toujours des résultats vides lorsqu'il y a une valeur <code>NULL
. La requête est sujette aux erreurs🎜🎜La colonne NULL
nécessite une valeur. octet supplémentaire pour déterminer si lors de l'utilisation de NULL
pour le bit d'indicateur 🎜🎜 de NULL
, il peut ne pas être du même type que les autres valeurs de la colonne, ce qui pose des problèmes . (Il se comporte différemment selon les langues) 🎜🎜MySQL a du mal à optimiser les requêtes pour les colonnes qui peuvent être NULL
🎜🎜🎜Donc, pour les champs qui étaient paresseux auparavant, définissez manuellement une valeur par défaut, la chaîne de caractères nulle , ajoutez 0. 🎜🎜Bien que cette méthode n'améliore pas beaucoup les performances de MySQL, c'est une bonne habitude, et les petites choses font de grandes choses, alors n'ignorez pas ces détails. 🎜🎜🎜🎜Ajouter un index🎜🎜Pour les champs fréquemment interrogés, veuillez ajouter des index. La vitesse de requête avec et sans index diffère de dix fois ou plus. 🎜🎜🎜De manière générale, chaque table doit avoir un champ de clé primaire id
🎜🎜Les champs couramment utilisés pour les requêtes doivent être indexés 🎜🎜Champs de type varchar
, lors de la création Lors de l'indexation , il est préférable de spécifier la longueur🎜🎜Lorsque la requête comporte plusieurs conditions, les conditions avec index sont préférées🎜🎜Les recherches floues telles que les conditions LIKE
ne sont pas valides pour les index de champ et des clés supplémentaires doivent être établies Index de mots à résoudre🎜🎜Veuillez essayer de ne pas contraindre la relation entre les tables au niveau de la base de données. Les dépendances entre ces tables doivent être résolues au niveau du code🎜🎜🎜Lorsqu'il y a un problème entre les tables Quand. contraignant, bien que l'instruction SQL d'ajout, de suppression et de requête devienne plus simple, l'effet négatif est que la base de données vérifiera les contraintes pour des opérations telles que l'insertion (bien que les contraintes puissent être définies manuellement pour les ignorer), ce qui équivaut à écrire quelques logique métier à la couche de base de données. Facile à maintenir. 🎜🎜🎜🎜Optimiser la structure des champs de la table🎜🎜N'utilisez pas de types de chaîne pour les données de la base de données qui peuvent être représentées par des entiers. L'utilisation de varchar
ou de char
dépend de. le champ. 🎜🎜Ce type d'optimisation n'est souvent pas réalisable lorsqu'il y a une grande quantité de données dans la base de données. Il est préférable de la concevoir avant la conception de la base de données. 🎜🎜🎜Pour les colonnes avec des valeurs possibles très limitées, utilisez tinyint
au lieu de VARCHAR
, 🎜🎜Par exemple, pour enregistrer la plate-forme d'appareil mobile, il n'y a que deux valeurs : Android , ios, alors Vous pouvez utiliser 0 pour représenter android et 1 pour représenter ios. Ce type de colonne doit être bien commenté🎜🎜Pourquoi ne pas utiliser ENUM
? Il est difficile de développer ENUM
. Par exemple, lorsque la plate-forme mobile a ensuite ajouté un ipad
, cela ne serait-il pas déroutant ? Mais ajoutez simplement un 2 à tinyint.
et ENUM
sont très étranges à gérer dans le code. Qu'il soit traité comme un entier ou une chaîne varie d'une langue à l'autre. 🎜🎜Dans cette méthode, la signification de chaque valeur doit être écrite dans le commentaire ou le code de la base de données🎜🎜🎜🎜Pour ces chaînes de longueur fixe, vous pouvez utiliser char
, tel que le code postal, qui est toujours 5 chiffres🎜 🎜Pour les chaînes de longueur inconnue, utilisez varchar
🎜🎜N'abusez pas de bigint
, comme le champ id
de la table qui enregistre le nombre d'articles, utilisez int
fera l'affaire, la limite supérieure de 2,1 milliards d'articles est suffisante🎜🎜Briser correctement le paradigme de la base de données et ajouter des champs redondants pour éviter les connexions de table lors des requêtes🎜🎜🎜Lors de l'interrogation, assurez-vous d'utiliser le type int
. Il est plus rapide que varchar
, car la comparaison d'entiers peut être réalisée en appelant directement l'opérateur sous-jacent, tandis que la comparaison de chaînes nécessite des caractères- comparaison par caractère. 🎜🎜La requête de données de longueur fixe est plus rapide que la requête de données de longueur variable, car le décalage entre les données de longueur fixe et les données est fixe et il est facile de calculer le décalage des données suivantes. Pour les données de longueur variable, une étape supplémentaire est nécessaire pour interroger le décalage des données suivantes. mais. Les données de longueur fixe peuvent gaspiller davantage d'espace de stockage. 🎜Pour les tables dont le volume de données peut dépasser 5 millions dans un avenir proche ou croître rapidement, assurez-vous de diviser les tables verticalement ou horizontalement à l'avance. Lorsque le volume de données dépasse un million, la vitesse de requête sera. déclin évident.
Essayez de finaliser le plan de la sous-base de données et de la sous-table dès le début de la conception de la base de données, sinon cela augmentera considérablement la complexité du code et sera difficile à modifier plus tard.
Le partitionnement vertical de la table est basé sur des variables externes telles que les dates, et le partitionnement horizontal de la table est basé sur certaines relations de champs dans la table, en utilisant le mappage de hachage pour diviser la table en parties égales.
La condition préalable pour la sous-base de données et la sous-base de données de table est qu'avant d'exécuter l'instruction de requête, vous sachiez déjà dans quelle sous-base de données et dans quelle sous-table les données à interroger peuvent appartenir.
C'est l'initiateur de goulots d'étranglement dans les bases de données dans de nombreux systèmes.
LIKE
LIKE
is null
的列or
est nul
ou sur des colonnes non indexées
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!