Voici quelques questions MySQL qui sont souvent rencontrées lors des entretiens et des études. Exemple d'optimisation d'une instruction SQL : 1) Essayez d'éviter d'utiliser les opérateurs != ou dans les clauses Where, sinon le moteur abandonnera l'utilisation de l'index et effectuera une analyse complète de la table. 2) Essayez d'éviter de juger la valeur nulle du champ dans la clause Where, sinon le moteur abandonnera l'utilisation de l'index et effectuera une analyse complète de la table, telle que : sélectionnez l'identifiant à partir de t où num est nul
【Recommandations de sujets connexes : questions d'entretien MySQL (2020)]
Clé primaire :
Une combinaison de colonnes de données ou d'attributs dans une table de base de données qui identifie de manière unique et complète l'objet de données stocké. Une colonne de données ne peut avoir qu'une seule clé primaire , et la valeur de la clé primaire ne peut pas manquer, c'est-à-dire qu'elle ne peut pas être nulle.
Super clé :
L'ensemble des attributs qui peuvent identifier de manière unique un tuple dans une relation est appelé la super clé du schéma relationnel. Un attribut peut être utilisé comme super clé, et plusieurs attributs combinés peuvent également être utilisés comme super clé. La super clé contient la clé candidate et la clé primaire.
Clés candidates :
est une super-clé minimale, c'est-à-dire une super-clé sans éléments redondants.
Clé étrangère :
La clé primaire d'une autre table qui existe dans une table est appelée la clé étrangère de cette table.
Quatre éléments de base pour la bonne exécution des transactions de transaction de base de données. ACIDE, Atomicité, Correspondance, Isolement, Durabilité.
Atomicité : Toutes les opérations de l'ensemble de la transaction sont soit terminées, soit non terminées, et il est impossible de stagner dans un maillon intermédiaire. Si une erreur se produit lors de l'exécution de la transaction, elle sera restaurée à l'état avant le début de la transaction, comme si la transaction n'avait jamais été exécutée.
Cohérence : Les contraintes d'intégrité de la base de données ne sont pas violées avant le début de la transaction et après la fin de la transaction.
Isolement : Un état isolé exécute les transactions comme si elles étaient les seules opérations effectuées par le système à un instant donné. S'il y a deux transactions exécutées en même temps et remplissant la même fonction, l'isolation des transactions garantira que chaque transaction du système pense que seule cette transaction utilise le système. Cette propriété est parfois appelée sérialisation. Pour éviter toute confusion entre les opérations de transaction, les requêtes doivent être sérialisées ou désérialisées afin qu'il n'y ait qu'une seule requête pour les mêmes données à la fois.
Persistance : Une fois la transaction terminée, les modifications apportées par la transaction à la base de données sont conservées dans la base de données et ne seront pas annulées.
Une vue est une table virtuelle. Contrairement à une table qui contient des données, une vue contient uniquement des requêtes qui récupèrent dynamiquement des données lorsqu'elles sont utilisées ; L'utilisation de vues peut simplifier des opérations SQL complexes, masquer des détails spécifiques et protéger les données ; une fois les vues créées, elles peuvent être utilisées de la même manière que les tables.
Les vues ne peuvent pas être indexées, ni avoir de déclencheurs associés ou de valeurs par défaut. S'il y a un ordre par dans la vue elle-même, l'ordre par à nouveau sur la vue sera écrasé.
Créer une vue : créer la vue XXX en tant que XXXXXXXXXXXXXX ;
Pour certaines vues, telles que l'Union distincte qui n'utilise pas la fonction d'agrégation de regroupement de sous-requêtes de jointure, etc., elles peuvent être mises à jour et les mises à jour de la vue seront mises à jour la table de base ; Cependant, les vues sont principalement utilisées pour simplifier la récupération et protéger les données, et ne sont pas utilisées pour les mises à jour, et la plupart des vues ne peuvent pas être mises à jour.
drop supprime la table directement et tronque supprime les données dans la table Lors de la nouvelle insertion, l'identifiant passera de 1 et la suppression supprimera. les données dans le tableau. Vous pouvez ajouter des mots où.
(1) L'instruction DELETE supprime une ligne de la table à la fois et enregistre en même temps l'opération de suppression de la ligne en tant qu'enregistrement de transaction dans le journal pour l'opération de restauration. TRUNCATE TABLE supprime toutes les données de la table en même temps et n'enregistre pas les enregistrements d'opérations de suppression individuelles dans le journal. Les lignes supprimées ne peuvent pas être récupérées. Et le déclencheur de suppression lié à la table ne sera pas activé pendant le processus de suppression. La vitesse d'exécution est rapide.
(2) L'espace occupé par les tables et les index. Lorsqu'une table est TRUNCATE, l'espace occupé par la table et les index sera restauré à sa taille d'origine et l'opération DELETE ne réduira pas l'espace occupé par la table ou les index. L'instruction drop libère tout l'espace occupé par la table.
(3) De manière générale, supprimez > tronquer > supprimez
(4) Champ d'application. TRUNCATE ne peut être utilisé que pour TABLE ; DELETE peut être une table et une vue
(5) TRUNCATE et DELETE suppriment uniquement les données, tandis que DROP supprime la table entière (structure et données).
(6) tronquer et supprimer sans où : supprime uniquement les données, mais pas la structure (définition) de la table. L'instruction drop supprimera les contraintes (contrainte), déclenchera (déclencheur) l'index (index) de la table. dont dépend la structure. );Les procédures/fonctions stockées qui dépendent de la table seront conservées, mais leur statut deviendra : invalide.
(7) L'instruction de suppression est DML (langage de maintenance des données). Cette opération sera placée dans le segment de restauration et ne prendra effet qu'après la soumission de la transaction. S'il existe un tigre correspondant, il sera déclenché lors de l'exécution.
(8) tronquer et supprimer sont des DLL (langage de définition de données), et les opérations prennent effet immédiatement. Les données d'origine ne sont pas placées dans le segment d'annulation et ne peuvent pas être annulées
(9). ) En l'absence de sauvegarde, utilisez drop et truncate avec prudence. Pour supprimer certaines lignes de données, utilisez delete et combinez-les avec où limiter la portée de l'influence. Le segment d'annulation doit être suffisamment grand. Pour supprimer une table, utilisez drop ; si vous souhaitez conserver la table mais supprimer les données de la table, si cela n'a rien à voir avec la transaction, utilisez truncate. Si cela est lié à une transaction ou si l'enseignant souhaite déclencher un déclencheur, utilisez toujours la suppression.
(10) Truncate table table name est rapide et efficace car :
truncate table est fonctionnellement identique à l'instruction DELETE sans clause WHERE : les deux suppriment toutes les lignes de la table. Cependant, TRUNCATE TABLE est plus rapide que DELETE et utilise moins de ressources système et du journal des transactions. L'instruction DELETE supprime une ligne à la fois et enregistre une entrée dans le journal des transactions pour chaque ligne supprimée. TRUNCATE TABLE supprime les données en libérant les pages de données utilisées pour stocker les données de la table et enregistre uniquement la page libérée dans le journal des transactions.
(11) TRUNCATE TABLE supprime toutes les lignes du tableau, mais la structure du tableau et ses colonnes, contraintes, index, etc. restent inchangés. Le nombre utilisé pour identifier les nouvelles lignes est réinitialisé à la valeur de départ de cette colonne. Si vous souhaitez conserver la valeur du nombre d'identités, utilisez plutôt DELETE. Si vous souhaitez supprimer une définition de table et ses données, utilisez l'instruction DROP TABLE.
(12) Pour les tables référencées par des contraintes FOREIGN KEY, TRUNCATE TABLE ne peut pas être utilisée, mais une instruction DELETE sans clause WHERE doit être utilisée. Étant donné que TRUNCATE TABLE n'est pas journalisé, il ne peut pas activer le déclencheur.
L'index de base de données est une structure de données triée dans le système de gestion de base de données pour faciliter l'interrogation et la mise à jour rapides des données des tables de base de données. . L'implémentation de l'index utilise généralement B-tree et sa variante B+ tree.
En plus des données, le système de base de données conserve également des structures de données qui satisfont des algorithmes de recherche spécifiques. Ces structures de données font référence (pointent vers) les données d'une manière ou d'une autre, afin que des algorithmes de recherche avancés puissent être implémentés sur ces structures de données. . Cette structure de données est un index.
Il y a des coûts à payer pour définir des index sur les tables : premièrement, l'espace de stockage de la base de données est augmenté, et deuxièmement, il faut plus de temps pour insérer et modifier les données (car l'index change également en conséquence).
La figure montre une méthode d'indexation possible. Sur la gauche se trouve un tableau de données avec un total de deux colonnes et sept enregistrements. Celui le plus à gauche est l'adresse physique de l'enregistrement de données (notez que les enregistrements logiquement adjacents ne sont pas nécessairement physiquement adjacents sur le disque). Afin d'accélérer la recherche de Col2, vous pouvez conserver un arbre de recherche binaire comme indiqué à droite. Chaque nœud contient la valeur de la clé d'index et un pointeur vers l'adresse physique de l'enregistrement de données correspondant. être utilisé dans O(log2n).
La création d'index peut grandement améliorer les performances du système. Premièrement, en créant un index unique, l'unicité de chaque ligne de données dans la table de la base de données peut être garantie. Deuxièmement, cela peut considérablement accélérer la récupération des données, ce qui est également la principale raison de la création d'un index. Troisièmement, cela peut accélérer la connexion entre les tables, ce qui est particulièrement important pour garantir l'intégrité référentielle des données. Quatrièmement, lors de l'utilisation de clauses de regroupement et de tri pour la récupération de données, le temps de regroupement et de tri dans la requête peut également être considérablement réduit. Cinquièmement, en utilisant des index, vous pouvez utiliser des caches d'optimisation pendant le processus de requête pour améliorer les performances du système. Certaines personnes peuvent se demander : il y a tellement d'avantages à ajouter un index, pourquoi ne pas créer un index pour chaque colonne du tableau ? Car l’ajout d’index présente également de nombreux inconvénients. Premièrement, la création et la maintenance d'index prennent du temps, et ce temps augmente à mesure que la quantité de données augmente. Deuxièmement, l'index doit occuper de l'espace physique en plus de l'espace de données occupé par la table de données, chaque index occupe également une certaine quantité d'espace physique. Si vous souhaitez créer un index clusterisé, l'espace. requis sera plus grand. Troisièmement, lors de l'ajout, de la suppression et de la modification de données dans la table, l'index doit être maintenu dynamiquement, ce qui réduit la vitesse de maintenance des données.Les index sont construits sur certaines colonnes de la table de la base de données. Lors de la création d'un index, vous devez déterminer sur quelles colonnes peuvent être indexées et quelles colonnes ne peuvent pas être indexées. De manière générale, des index doivent être créés sur ces colonnes : Sur les colonnes fréquemment recherchées, vous pouvez accélérer les recherches ; sur les colonnes qui servent de clés primaires, vous pouvez renforcer l'unicité de la colonne et organiser les données. dans le tableau. La structure d'arrangement ; sur les colonnes qui sont souvent utilisées dans les connexions, ces colonnes sont principalement des clés étrangères, ce qui peut accélérer la connexion ; trié, et sa plage spécifiée est Continue ; créer des index sur les colonnes qui doivent souvent être triées, car l'index a été trié, afin que les requêtes puissent utiliser le tri de l'index pour accélérer le temps de tri des requêtes ; souvent utilisé dans la clause WHERE pour accélérer le jugement des conditions.
De plus, certaines colonnes ne doivent pas être indexées. De manière générale, ces colonnes qui ne doivent pas être indexées ont les caractéristiques suivantes :
Premièrement, les index ne doivent pas être créés pour des colonnes rarement utilisées ou référencées dans les requêtes. En effet, ces colonnes étant rarement utilisées, l’indexation ou non n’améliore pas la vitesse des requêtes. Au contraire, du fait de l’ajout d’index, la vitesse de maintenance du système est réduite et les besoins en espace sont augmentés.
Deuxièmement, les index ne doivent pas être augmentés pour les colonnes contenant peu de valeurs de données. En effet, comme ces colonnes ont très peu de valeurs, comme la colonne sexe de la table personnel, dans les résultats de la requête, les lignes de données du jeu de résultats représentent une grande proportion des lignes de données de la table, c'est-à-dire : les données qui doivent être recherchées dans le tableau La proportion de lignes est énorme. L'augmentation de l'index n'accélère pas significativement la récupération.
Troisièmement, les index ne doivent pas être ajoutés aux colonnes définies comme types de données texte, image et bits. En effet, le volume de données de ces colonnes est soit assez important, soit très peu de valeurs.
Quatrièmement, lorsque les performances de modification sont bien supérieures aux performances de récupération, l'index ne doit pas être créé. En effet, les performances de modification et les performances de récupération sont contradictoires . Lors de l'ajout d'index, les performances de récupération seront améliorées, mais les performances de modification seront réduites. Lors de la réduction des index, les performances de modification augmenteront et les performances de récupération diminueront. Par conséquent, lorsque les performances de modification sont bien supérieures aux performances de récupération, les index ne doivent pas être créés.
En fonction de la fonctionnalité de la base de données, trois types d'index peuvent être créés dans le concepteur de base de données : index unique, index de clé primaire et index clusterisé.
Index unique
Un index unique est un index qui ne permet pas à deux lignes d'avoir la même valeur d'index.
La plupart des bases de données ne permettent pas d'enregistrer les index uniques nouvellement créés avec la table lorsqu'il y a des valeurs de clé en double dans les données existantes. La base de données peut également empêcher l'ajout de nouvelles données qui créeraient des valeurs de clé en double dans le tableau. Par exemple, si un index unique est créé sur le nom de famille de l'employé (lname) dans la table des employés, deux employés ne peuvent pas avoir le même nom de famille. Index de clé primaire Les tables de base de données ont souvent une colonne ou une combinaison de colonnes dont la valeur identifie de manière unique chaque ligne de la table. Cette colonne est appelée clé primaire de la table. La définition d'une clé primaire pour une table dans un diagramme de base de données crée automatiquement un index de clé primaire, qui est un type spécifique d'index unique. L'index exige que chaque valeur de la clé primaire soit unique. Il permet également un accès rapide aux données lors de l'utilisation d'un index de clé primaire dans une requête. Index clusterisé Dans un index clusterisé, l'ordre physique des lignes du tableau est le même que l'ordre logique (index) des valeurs clés. Une table ne peut contenir qu'un seul index clusterisé.
Si un index n'est pas un index clusterisé, l'ordre physique des lignes du tableau ne correspond pas à l'ordre logique des valeurs clés. Les index clusterisés offrent généralement un accès aux données plus rapide que les index non clusterisés.
En raison des caractéristiques du support de stockage, l'accès au disque lui-même est beaucoup plus lent que la mémoire principale, couplé au coût du mouvement mécanique. , la vitesse d'accès au disque est souvent un centième de celle de la mémoire principale, donc afin d'améliorer l'efficacité, les E/S disque doivent être minimisées. Afin d'atteindre cet objectif, le disque ne lit souvent pas strictement à la demande, mais lit à l'avance à chaque fois. Même si un seul octet est nécessaire, le disque démarre à partir de cette position et lit séquentiellement une certaine longueur de données vers l'arrière. mémoire. La base théorique de cela est le fameux Principe de localité en informatique : Lorsqu'une donnée est utilisée, les données à proximité sont généralement utilisées immédiatement. Les données requises lors de l'exécution du programme sont généralement concentrées.
Étant donné que les lectures séquentielles sur disque sont très efficaces (pas de temps de recherche, très peu de temps de rotation), la lecture anticipée peut améliorer les E/S pour les programmes avec une Oefficacité locale.
La longueur de lecture anticipée est généralement un multiple entier de la page. Les pages sont des blocs logiques de mémoire gérée par l'ordinateur. Le matériel et les systèmes d'exploitation divisent souvent les zones de mémoire principale et de stockage sur disque en blocs consécutifs de taille égale. Chaque bloc de stockage est appelé une page (dans de nombreux systèmes d'exploitation, la taille de la page est généralement de 4 Ko). la mémoire principale et le disque échangent des données en unités de pages. Lorsque les données à lire par le programme ne sont pas dans la mémoire principale, une exception de défaut de page sera déclenchée. À ce moment, le système enverra un signal de lecture au disque et le disque trouvera la position de départ des données. et lisez une ou plusieurs pages à l'envers. Chargez-les en mémoire, puis revenez anormalement et le programme continue de s'exécuter.
À ce stade, nous pouvons enfin analyser les performances de l'indice B-/+Tree.
Comme mentionné ci-dessus, le nombre d'E/S disque est généralement utilisé pour évaluer la qualité de la structure de l'index. Commençons par l’analyse B-Tree. Selon la définition de B-Tree, on peut voir qu’un maximum de h nœuds doivent être visités pour une récupération. Les concepteurs du système de base de données ont intelligemment tiré parti du principe de lecture anticipée du disque et ont fixé la taille d'un nœud à une page, afin que chaque nœud puisse être entièrement chargé avec une seule E/S. Afin d'atteindre cet objectif, les techniques suivantes doivent être utilisées dans la mise en œuvre réelle de B-Tree :
Chaque fois qu'un nouveau nœud est créé, postulez directement pour une page d'espace, garantissant ainsi qu'un nœud est physiquement stocké dans une page. De plus, l'allocation de stockage informatique est alignée sur la page, ce qui signifie qu'une seule E/S est requise pour un nœud.
Une récupération dans B-Tree nécessite au plus h-1 E/S (le nœud racine réside en mémoire), et la complexité asymptotique est O(h)=O(log dN). Dans les applications pratiques générales, le degré sortant d est un très grand nombre, généralement supérieur à 100, donc h est très petit (généralement pas plus de 3).
Pour les structures comme les arbres rouge-noir, h est évidemment beaucoup plus profond. Puisque les nœuds logiquement proches (parents et enfants) peuvent être physiquement éloignés, la localité ne peut pas être exploitée, donc la complexité asymptotique d'E/S de l'arbre rouge-noir est également O(h), et l'efficacité est évidemment bien pire que celle de le B-Tree.
En résumé, utiliser B-Tree comme structure d'index est très efficace.
Exécuté dans l'analyseur de requêtes :
–Créer des tables table1, table2 :
créer une table table1(id int, nom varchar(10))
créer une table table2(id int,score int)
insérer dans la table1 sélectionner 1,'lee'
insérer dans la table1 sélectionner 2,'zhang'
insérer dans la table1 sélectionner 4,'wang'
insérer dans la table2 sélectionnez 1,90
insérer dans le tableau2 sélectionnez 2,100
insérez dans le tableau2 sélectionnez 3,70
tel que le tableau
————————————————-
table1 | table2 |
————————————————-
id nom |id score |
1 lee |1 90|
2 zhang| 100|
4 wang| 3 70|
————————————————-
Les éléments suivants sont tous exécutés dans l'analyseur de requêtes
1 .Jointure externe
1. Concept : y compris la jointure externe gauche, la jointure externe droite ou la jointure externe complète
2. Jointure gauche : jointure externe gauche ou jointure externe gauche
(1) Jointure externe gauche Le résultat. set inclut toutes les lignes de la table de gauche spécifiée dans la clause LEFT OUTER, pas seulement les lignes correspondant aux colonnes de jointure. Si une ligne du tableau de gauche n'a aucune ligne correspondante dans le tableau de droite, toutes les colonnes de la liste de sélection du tableau de droite seront nulles dans la ligne de l'ensemble de résultats associée.
(2)instruction SQL
select * from table1 left join table2 on table1.id=table2.id
————-Result————-
idnameidscore
——— — ————————
1lee190
2zhang2100
4wangNULLNULL
——————————
Remarque : contient toutes les clauses de la table1 et renvoie la table2 en conséquence selon les conditions spécifiées Les champs qui ne correspondent pas sont affichés comme nuls
3. Jointure droite : jointure droite ou jointure externe droite
(1) La jointure externe droite est la jointure inversée de la jointure externe gauche. Toutes les lignes du tableau de droite seront renvoyées. Si une ligne du tableau de droite n’a aucune ligne correspondante dans le tableau de gauche, NULL sera renvoyé pour le tableau de gauche.
(2)instruction SQL
select * from table1 right join table2 on table1.id=table2.id
————-Result————-
idnameidscore
——— — ————————
1lee190
2zhang2100
NULLNULL370
——————————
Remarque : contient toutes les clauses de la table2 et renvoie la table1 en conséquence selon les conditions spécifiées Les champs qui ne correspondent pas sont affichés comme nuls
4. Jointure externe complète : jointure complète ou jointure externe complète
(1) La jointure externe complète renvoie toutes les lignes des tables de gauche et de droite. Lorsqu'une ligne n'a aucune ligne correspondante dans une autre table, la colonne de liste de sélection de l'autre table contient des valeurs nulles. S'il y a des lignes correspondantes entre les tables, la ligne entière de l'ensemble de résultats contient les valeurs de données de la table de base.
(2)instruction SQL
select * from table1 full join table2 on table1.id=table2.id
————-Result————-
idnameidscore
——————————
1lee190
2zhang2100
4wangNULLNULL
NULLNULL370
——————————
Remarque : Retournez à gauche et connexions droites et (voir jointures gauche et droite ci-dessus)
2. Jointures internes
1 Concept : Les jointures internes sont des jointures qui utilisent des opérateurs de comparaison pour comparer les valeurs des colonnes à être. rejoint
2.Jointure interne : jointure ou jointure interne
Instruction 3.sql
select * from table1 join table2 on table1.id=table2.id
———— -Résultat———— -
idnameidscore
——————————
1lee190
2zhang2100
——————————
Remarque : Renvoie uniquement les colonnes conditionnelles de la table1 et de la table2
4 Équivalent (même effet d'exécution que ce qui suit)
A : sélectionnez a.*,b.* dans la table1 a,table2. b où a.id =b.id
B:select * from table1 cross join table2 which table1.id=table2.id (Remarque : vous ne pouvez utiliser que l'endroit où ajouter des conditions après la jointure croisée, pas sur)
3. Jointure croisée (complète)
1. Concept : Une jointure croisée sans clause WHERE produira un produit cartésien des tables impliquées dans le rejoindre. Le nombre de lignes du premier tableau multiplié par le nombre de lignes du deuxième tableau est égal à la taille du jeu de résultats du produit cartésien. (La jointure croisée de table1 et table2 produit 3*3=9 enregistrements)
2. Jointure croisée : jointure croisée (sans condition où...)
3. Instruction .sql
select * from table1 cross join table2
————-Result————-
idnameidscore
——————————
1lee190
2zhang190
4wang190
1lee2100
2zhang2100
4wang2100
1lee370
2zhang370
4wang370
——————————
Remarque : Retour 3 *3 =9 enregistrements, soit un produit cartésien
4. Équivalent (même effet d'exécution que le suivant)
A : sélectionnez * dans la table1, la table2
1 Première forme normale (1NF)
Dans toute base de données relationnelle, la première forme normale (1NF) est le modèle relationnel Exigences de base , une base de données qui ne répond pas à la première forme normale (1NF) n'est pas une base de données relationnelle.
La première forme normale (1NF) signifie que chaque colonne de la table de la base de données est une donnée de base indivisible. Il ne peut pas y avoir plusieurs valeurs dans la même colonne, c'est-à-dire qu'un attribut de l'entité ne peut pas avoir. plusieurs valeurs ou ne peuvent pas avoir d'attributs en double. Si des attributs en double apparaissent, vous devrez peut-être définir une nouvelle entité. La nouvelle entité est composée d'attributs en double. Il existe une relation un-à-plusieurs entre la nouvelle entité et l'entité d'origine. Dans la première forme normale (1NF), chaque ligne du tableau contient des informations sur une seule instance. En bref, La première forme normale est une colonne sans doublons.
2 Deuxième forme normale (2NF)
La deuxième forme normale (2NF) est construite sur la base de la première forme normale (1NF), qui is Pour satisfaire la deuxième forme normale (2NF), vous devez d'abord satisfaire la première forme normale (1NF). La deuxième forme normale (2NF) exige que chaque instance ou ligne d'une table de base de données puisse être distinguée de manière unique. Pour réaliser la différenciation, il est généralement nécessaire d'ajouter une colonne au tableau pour stocker l'identifiant unique de chaque instance. Cette colonne d'attribut unique est appelée clé primaire ou clé primaire ou clé primaire.
La Deuxième Forme Normale (2NF) exige que les attributs d'une entité dépendent entièrement de la clé primaire. La dépendance dite complète signifie qu'il ne peut pas y avoir un attribut qui ne repose que sur une partie de la clé primaire. S'il existe, alors cet attribut et cette partie de la clé primaire doivent être séparés pour former une nouvelle entité. un à plusieurs avec la relation d’entité d’origine. Pour réaliser la différenciation, il est généralement nécessaire d'ajouter une colonne au tableau pour stocker l'identifiant unique de chaque instance. En bref, La deuxième forme normale signifie que les attributs non principaux ne dépendent pas partiellement du mot-clé principal.
3 Troisième forme normale (3NF)
Pour satisfaire la troisième forme normale (3NF), vous devez d'abord satisfaire la deuxième forme normale (2NF). En bref, la troisième forme normale (3NF) exige qu'une table de base de données ne contienne pas d'informations de clé non primaire déjà contenues dans d'autres tables. Par exemple, il existe un tableau d'informations sur les départements, dans lequel chaque département possède un numéro de département (dept_id), un nom de département, un profil de département et d'autres informations. Ensuite, une fois le numéro de service répertorié dans le tableau d'informations sur l'employé, le nom du service, le profil du service et d'autres informations relatives au service ne peuvent pas être ajoutés au tableau d'informations sur l'employé. Si le tableau d'informations sur le département n'existe pas, il doit être construit selon la troisième forme normale (3NF), sinon il y aura beaucoup de redondance des données. En bref, La troisième forme normale est que les attributs ne dépendent pas d'autres attributs non primaires. (Ma compréhension est d'éliminer la redondance)
Je me suis inspiré du cours sur l'optimisation des bases de données sur le MOOC.
1) Essayez d'éviter d'utiliser les opérateurs != ou dans les clauses Where, sinon le moteur abandonnera l'utilisation de l'index et effectuera une analyse complète de la table. .
2) Essayez d'éviter de porter des jugements de valeur nulle sur les champs de la clause Where, sinon le moteur abandonnera l'utilisation de l'index et effectuera une analyse complète de la table, telle que :
sélectionnez l'identifiant à partir de t où num est nul
Vous pouvez définir la valeur par défaut 0 sur num, vous assurer qu'il n'y a pas de valeur nulle dans la colonne num du tableau, puis interroger comme ceci :
sélectionner l'identifiant à partir de t où num=0
3) Plusieurs fois existe est utilisé à la place de in. Un bon choix
4) Remplacez la clause HAVING par la clause Where car HAVING ne filtrera l'ensemble de résultats qu'après avoir récupéré tous les enregistrements
Voir l'index ci-dessus
1) Optimisation du paradigme : comme l'élimination de la redondance (économie d'espace...) 2) Optimisation anti-paradigme : comme l'ajout d'une redondance appropriée (réduction des jointures) 3) Diviser le table : Les partitions séparent physiquement les données. Les données de différentes partitions peuvent être stockées dans des fichiers de données sur différents disques. De cette façon, lors de l'interrogation de cette table, il vous suffit d'analyser la partition de la table au lieu d'analyser la table entière, ce qui réduit considérablement le temps d'interrogation. De plus, les partitions sur différents disques disperseront également la transmission des données de cette table sur différents. emplacements des E/S disque, une partition soigneusement configurée peut répartir uniformément la concurrence en matière de transfert de données pour les E/S disque. Cette méthode peut être utilisée pour les horaires comportant de grandes quantités de données. Les partitions de table peuvent être créées automatiquement sur une base mensuelle.
4) Le fractionnement est en fait divisé en fractionnement vertical et fractionnement horizontal : Cas : Un système d'achat simple implique temporairement les tableaux suivants : 1. Tableau des produits (volume de données : 100 000, stable) 2. Tableau des commandes (volume de données : 2 millions , et Il y a une tendance à la croissance) 3. Table utilisateur (le volume de données est de 1 million et il y a une tendance à la croissance) Prenez mysql comme exemple pour décrire le fractionnement horizontal et le fractionnement vertical. L'ordre de grandeur que mysql peut tolérer varie de. un million de données statiques à des dizaines de millions Division verticale : Résoudre le problème : io la concurrence entre les tables ne résout pas le problème : la pression provoquée par l'augmentation de la quantité de données dans une seule table Solution : Mettre le table produit et table utilisateur sur un serveur et placez la table de commande sur un serveur séparé Sur Partage horizontal : Résoudre le problème : La pression provoquée par la croissance du volume de données dans une seule table ne résout pas le problème : io compétition entre les tables
Solution : La table des utilisateurs est divisée en table des utilisateurs masculins par sexe. La table des commandes de la table des utilisateurs féminins est divisée en commandes terminées et commandes inachevées en passant par la table des produits et les commandes inachevées. un serveur. La boîte de table de commande terminée est placée sur une table d'utilisateur masculin et placée sur un serveur. La table d'utilisateur féminin est placée sur un serveur. (Les femmes adorent faire du shopping haha)
La seule différence entre les deux est que EXECUTE ne peut pas. être utilisé dans l'appel d'instruction triggers, mais déclenche (active) automatiquement l'exécution lorsque l'utilisateur exécute une instruction Transact-SQL. Un déclencheur est une procédure stockée exécutée lorsque les données d'une table spécifiée sont modifiées. Habituellement, les déclencheurs sont créés pour garantir l'intégrité référentielle et la cohérence des données logiquement liées dans différentes tables. Étant donné que les utilisateurs ne peuvent pas contourner les déclencheurs, ils peuvent être utilisés pour appliquer des règles métier complexes afin de garantir l'intégrité des données. Les déclencheurs sont différents des procédures stockées. Les déclencheurs sont principalement exécutés via des déclencheurs d'exécution d'événements , tandis que les procédures stockées peuvent être directement appelées via le nom de la procédure stockée. Lorsque des opérations telles que UPDATE, INSERT et DELETE sont effectuées sur une certaine table, SQLSERVER exécutera automatiquement les instructions SQL définies par le déclencheur, garantissant ainsi que le traitement des données doit être conforme aux règles définies par ces instructions SQL. Articles connexes :
Questions d'entretien courantes sur PHP
Questions d'entretien courantes sur jQuery
Vidéos associées :
Tutoriel vidéo MySQL sur la base de donné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!