Réimprimer Source: probablement les meilleurs points importants MySQL de l'ensemble du réseau / des questions de visage résumé
annuaire
2.1 quatre principales caractéristiques de la transaction (acide)
2.2 transactions simultanées apporter quels problèmes?
Magie de lecture 2.3 différence de degré ne se répète pas et
2.4 Quels sont le niveau d'isolation des transactions?
Le niveau d'isolement par défaut de 2,5 MySQL
3.1 Quel est l'indice peut améliorer la vitesse de recherche
3.2 Quel est le principe le plus gauche préfixe?
3.3 Mysql comment ajouter un index pour le champ de la table?
4.1 commandes Certains couramment utilisés
4,2 MyISAM et InnoDB différence
5.1 différence verrouillage optimiste et verrouillage pessimiste
5.2 d'autres types de scénarios d'utilisation des serrures
5.3 verrouillage optimiste deux implémentations communes
Inconvénient 5.4 verrouillage optimiste
5,5 mécanisme de verrouillage InnoDB et algorithme de verrouillage
5.6 verrou partagé et verrou exclusif
1, la différence entre les bases de données relationnelles et les bases de données non relationnelles
2, relative à une transaction
2.1 quatre principales caractéristiques de la transaction (acide)
- Atomique: la transaction A est la plus petite unité d'exécution ne permet pasdivision. Opération pour assureratomicité des transactions soit achevées ou totalement inefficaces;
- Cohérence: Avant et après la transaction, les données sont cohérentes, les mêmes résultats pour une pluralité de lecture de données de transaction est le même;
- Isolement: accès simultané à la basedonnées, une transaction utilisateur ne pas interférer avecautres entreprises,basesdonnées de transactions concurrentes sont indépendantes;
- La persistance: une transaction est validée après. Ilchangédonnées dans la basedonnées est persistante, même si la basedonnées échouene devrait pas avoir d'impact.
2.2 transactions simultanées apporter quels problèmes?
- lecture sale (Dirty lecture): Lecture non validée
- Modifier Lost (Perdu modifier): se réfère au moment où une opération lit une donnée,autre transaction accéder également les données, modifier ensuite les données dans cette première transaction après la deuxième transaction modifier également ces données. Ces modificationstraduisent par une transaction première est perdue, la perte de soidisant modifiée. Par exemple: Transaction 1 lit une table de données A = 20, A = transactionlecture 2 20 également, une opérationmodification A = A-1, A 2 modifier transaction = A-1, A = le résultat final 19, transaction. amendement 1 est perdu.
- lecture non reproductible (Unrepeatableread): des moyens dans une transaction lit les mêmes donnéesplusieurs reprises. Lorsque cette opération n'est pas terminée,autre transaction donne également accès aux données. Ainsi, entre les deux données lues dans la première transaction,raison de la modification de la deuxième transactionconduit aux premières données de transaction peut être lu deux fois pas la même chose. Celaarrivédeux reprises dans une transactionlecture données ne sont pas la même situation, queon appelle lecture non reproductible.
- Lecture Magie (lecture fantôme): Lecture Magie et répétable lit similaires. Il se produit dans une transaction (T1) est lue plusieurs lignes de données, suivie d'autre transaction concurrente (T2) est inséré dans une partie des données. Dans la requête suivante, la première transaction (T1) trouvera plus de quelques documents originaux n'existent pas, comme si les mêmes hallucinations arrivé, queon appellelectures fantômes.
Magie de lecture 2.3 différence de degré ne se répète pas et
- mise au point de lecture non reproductible est modifiée, la nouvelle mise au point est lu ou supprimer fantôme.
2.4 Quels sont le niveau d'isolation des transactions?
définit quatre niveaux d'isolement SQL standard:
- LIRE-UNCOMMITTED (lecture non validée): niveau le plus bas d'isolement, les changements n'ont pas été autorisé à lire les données fournies, il peut causer lit sale, lit non reproductible ou lit fantôme.
- Désengagés READ (lecture validée): permettre des transactions simultanées de lire les données déjà soumises, peut empêcher lit sale, mais fantôme lit ou lecture non reproductible peut encore se produire.
- REPEATABLE-READ (lecture de répéter): multiples lit les résultats du même domaine sont les mêmes, à moins que les données sont modifiées leurs affaires eux - mêmes, vous pouvez éviter les lectures sales et les lectures non reproductibles, mais les lectures fantômes se produisent encore.
- SERIALIZABLE (sérialisation): le plus haut niveau d'isolement, les niveaux d'isolement ACID pleine conformité. Toutes les transactions exécutées une par une dans l' ordre, il est impossible de produire des interférences entre ces questions, c'est - à - dire, ce niveau empêche lit sale, les lectures non reproductibles et les lectures fantômes.
Le niveau d'isolement par défaut de 2,5 MySQL
Pris en charge par le niveau d'isolement par défaut moteur de stockage InnoDB MySQL est répétable-READ (peut être re-lecture). Voir commande de niveau d'isolement est la suivante.
mysql> SELECT @@tx_isolation;
+-----------------+
| @@tx_isolation |
+-----------------+
| REPEATABLE-READ |
+-----------------+
Note: la différence est quemoteur de stockage standard SQL InnoDB ** REPEATABLE-READ (peut être re-lecture) l'utilisation du niveau d'isolation des transactions plus faible est la clé suivante algorithme de verrou, évitant ainsi de générermagie delecture, qui avecautres systèmes de base de données ( tels que SQL Server) sont différents. Ainsile moteur de stockage de support de niveau d'isolation par défaut InnoDB est répétable-READ (peut être re-lecture) a été complètement isolé pour assurer les besoins de la transaction.
Parce que plus le niveau d'isolement, la transaction moins demande un verrou, donc la plupart du niveau d'isolement du système de base de données est en lecture ENGAGE (soumission lecture):, mais vous savez que le moteur de stockage InnoDB est utilisé par défaut ** REPEATABLE-LIRE (peut être re-lecture) ** n'a pas de perte de performance.
moteur de stockage InnoDB dans le cas d'une transaction distribuée sera généralement utilisée ** SERIALIZABLE (sérialisation) de niveau d'isolement **.
3, liée à un index
3.1 Quel est l'indice peut améliorer la vitesse de recherche
Adresse de référence: https://juejin.im/post/5b55b842f265da0f9e589e79 Auteur: Java3y
3.2 Quel est le principe le plus gauche préfixe?
MySQL dans l'index peut faire référence à plusieurs colonnes dans un certain ordre, un tel indice appelé indice commun. Tels que le nom de la table utilisateur et la ville plus index commun (nom, ville), et le moyen le plus principe gauche préfixe lorsque la requête si la requête correspond exactement à l'index gauche un continu ou plusieurs colonnes, cette colonne peut être utilisée à. Comme suit:
select * from user where name=xx and city=xx ; //可以命中索引
select * from user where name=xx ; // 可以命中索引
select * from user where city=xx ; // 无法命中索引
Il convient de noter que, lors d'une interrogation si deux conditions sont utilisées, mais dans un ordre différent, comme ville = xx et xx = nom, maintenant du moteur de recherche optimise automatiquement pour correspondre à l'indice commun, est donc la capacité de frapper index.
Étant donné que le principe le plus gauche préfixe, lorsque vous créez un index commun, l'ordre des champs d'index doivent prendre en compte le nombre de valeurs de champ après désaccentuation, mettre plus avant. clause ORDER BY peut également suivre cette règle.
3.3 Mysql comment ajouter un index pour le champ de la table?
4, le moteur de stockage liés
4.1 commandes Certains couramment utilisés
4,2 MyISAM et InnoDB différence
MyISAM est le moteur de base de données MySQL par défaut (avant la version 5.5). Bien que les excellentes performances, mais fournit également un certain nombre de fonctionnalités, y compris l'indexation en texte intégral, la compression, les fonctions spatiales, etc., mais MyISAM ne supporte pas les transactions et verrouillage de ligne, et après l'effondrement du plus grand défaut n'est pas reprise en toute sécurité. Cependant, après la version 5.5, MySQL introduit InnoDB (moteur de base de données transactionnelle), la version par défaut du moteur de stockage MySQL 5.5 est InnoDB.
Les deux de comparaison:
- Supports verrouillage de ligne: MyISAM uniquement de verrouillageniveau table (verrouillage au niveau detable), alors que InnoDB supporteverrouillage de niveau ligne (verrouillage de ligne) etverrouillage au niveau detable, par défaut à verrouillage au niveau des lignes.
- Que ce soit pour soutenir l'opération et de rétablir la sécurité après un accident: MyISAMsouligné que la performance de chaque requête soit atomique, qui effectue plusieurs fois plus rapide quetype InnoDB, mais ne fournit passupport de transaction. Mais InnoDB offresupport de transaction dispose de basesdonnées avancées,affaires clés externes. Avec une transaction (commit), rollback transactiontoute sécurité (rollback) etcapacité de réparation collision (capacités de repriseincident) de (transactionnelles (conforme ACID)de type tableau.
- Que ce soit pour soutenir MVCC: Seulsoutien InnoDB. Faire face à hautes transactions concurrentes, MVCC est plus efficace quesimple blocage, MVCC quetravail en lecture ENGAGE et répétables niveau d'isolation READ deux, MVCC peut utiliser optimiste (optimiste) etverrouillage pessimiste verrouillage (pessimiste) est atteint, chaque basedonnées MVCCmiseœuvre n'est pas uniforme. Lecture recommandée: MySQL-InnoDB-MVCC multi Version Contrôleaccès simultané
- Que ce soit pour soutenir l' indexation en texte intégral: soutien MyISAM, InnoDB ne supporte pas.
- Que ce soit pour soutenir les clés étrangères: MyISAM ne prend pascharge etsoutien InnoDB.
5, lié de verrouillage
5.1 différence verrouillage optimiste et verrouillage pessimiste
- verrouillage Pessimiste: estsupposant le pirecas, obtenir un temps lorsquedonnéesautres pensentmodification sera, doncchaque fois qu'elle a pris les données seront verrouillées, afingens veulent prendre ces données sera bloqué jusqu'à ce qu'ilobtenu le verrou ( un temps à un fils de ressources partagées,autres threads sont bloqués, puis exécutez le transfert de ressources versautres threads). à l' intérieur traditionnel de basedonnées relationnelle à utiliser beaucoup de ce mécanisme de verrouillage, tels queverrous de ligne, serrures de table, etc., verrouillage lecture, verrou d'écriture, sont verrouillées avantfaire la première opération. La miseœuvre de Java synchronisée et ReentrantLock etautres verrou exclusif estpensée de verrouillage pessimiste.
- verrouillage optimiste : toujours supposer le meilleurcas, chaque foisles données sont à prendre d'autres personnes pensent n'est pas modifié, il ne sera pas verrouillé, mais quand la misejour déterminera ce queautres pendant ce temps ne va pas à mettrejour les données, vous pouvez utiliser le numéro de version mécanismes de CAS etalgorithmes. verrouillage optimiste est appropriée pour les types d'applications à lire,qui peut améliorerdébit, comme semblables mécanismes de write_condition fournis par la basedonnées, en fait,verrouillage optimiste est fourni. package java.util.concurrent.atomic en Java suivantclasses de variables atomiques est l'utilisation d'une miseœuvre du verrouillage optimiste CAS atteint.
5.2 d'autres types de scénarios d'utilisation des serrures
- verrouillage Pessimiste: appliquer à écrire la scène suivante. Parce que la situation va souvent écrireconflit plus général,qui conduit à l'application supérieure continuera d'être nouvelle tentative, comme mais réduit plutôt la performance
- Optimiste verrouillage: pourscénario multi-lecture (écrit moins), qui est, lorsque le conflit est vraiment rare,sortele verrou peut économiser le coût, augmenter le débit global du système.
5.3 verrouillage optimiste deux implémentations communes
- Le numéro de version des mécanismes
En règle générale, plus un numéro de version de données est le champ de version dans la table de données représentant le nombre de données sont modifiées, et lorsque des données sont modifiées, plus une valeur de version. Lorsqu'un thread A mettre à jour les valeurs de données sera lu valeur de version lors de la lecture des données, lors de la présentation de la mise à jour, si juste pour lire la version mise à jour lorsque la valeur égale est une version dans la base de données actuelle ou nouvelle tentative mise à jour jusqu'à ce que la mise à jour réussie.
Prenons un exemple simple:
table de compte de base de données a un champ de version, une valeur actuelle de 1, champ et le solde du compte courant (Balance) est de 100 $.
A cette époque, l'un opérateur de lecture (version = 1), et déduction de 50 $ (50 $ 100- $) du solde du compte.
Pendant le fonctionnement de l'opérateur A, B opérateur lit également les informations utilisateur (version = 1), et déduit du solde du compte est de 20 $ (100 $ 20 $).
L'opérateur Une révision complète du numéro de version de données plus une (version = 2), ainsi que le solde des déductions de compte (solde = 50 $), engagé à la mise à jour de base de données, cette fois en raison de présenter la version de données est supérieure à la base de données enregistre la version actuelle des données est enregistrement de base de données mise à jour est mis à jour à la version 2.
Le opérateur B pour terminer l'opération, mais aussi le numéro de version plus une (version = 2) essayer de présenter des données (solde = 80 $) à la base de données, mais cette fois que la découverte de la version d'enregistrement de base de données, le numéro de version de données de l'opérateur B, déposé 2 , la base de données enregistre également la version actuelle 2, ne répond pas à la « soumettre la version doit être supérieure à la version actuelle du dossier afin d'effectuer la mise à jour, » la stratégie de verrouillage optimiste, par conséquent, la soumission opérateur B a été rejetée.
Ainsi, pour éviter l'opérateur B avec le couvercle du résultat de fonctionnement de l' opérateur A peut être basé sur l'ancienne version = 1 résultats des données modifiées.
- algorithme CAS
À savoir, comparer et échanger (comparer et swap) est un algorithme sans verrouillage bien connus. programmation sans verrouillage, qui est, en cas de non synchronisation de l'utilisation de la variable de verrouillage entre plusieurs fils, qui est variable synchronisés en l'absence du fil est bloqué, il est aussi appelé synchronisation non bloquante (synchronisation non-bloquant). CAS algorithme comporte trois opérandes
- La nécessité de lire et de la valeur de la mémoire d'écriture V
- Comparaison de la valeur A
- B a l'intention d'écrire la nouvelle valeur
Si et seulement si la valeur est égale à V A, CAS B avec une nouvelle valeur en mettant à jour la valeur de V manière atomique, il n'effectuer aucune opération (comparer et substitutions sont une opération atomique). Normalement, une opération de filage, à savoir les tentatives en continu.
A propos de serrures de spin, vous pouvez regarder cet article, très bien: « entrevue compréhension approfondie doit de verrouillage de spin »
Inconvénient 5.4 verrouillage optimiste
- problème ABA
Si une variable V lorsque la lecture initiale est la valeur de A, et vérifie l'affectation au moment de la préparation, il est encore de la valeur A, alors nous serons en mesure d'expliquer sa valeur n'a pas été révisée encore un autre thread? De toute évidence pas, parce que pendant ce temps sa valeur peut être modifiée à d'autres valeurs, puis retour à A, cette opération CAS croira à tort qu'il n'a jamais été modifié. Ce problème est connu comme opérations CAS problème « ABA ».
JDK 1.5 après la classe de AtomicStampedReference offre une capacité d'un tel, qui est la méthode compareAndSet vérifie d'abord si la référence actuelle est égale à la référence attendue et la marque actuelle est égale au drapeau prévu, si tous égaux atomiquement le drapeau et la référence valeur à la valeur actualisée donnée.
- Grand temps long cycle frais généraux
Spin CAS (qui est, le cycle a été l'exécution sans succès jusqu'à ce qu'elle réussisse) ne réussit pas si longtemps, apportera une très grande CPU en tête d'exécution. Si la machine virtuelle Java peut prendre en charge les instructions de pause fournies par le processeur donc il y aura une amélioration de l'efficacité, commande de pause a deux objectifs, d'abord, il peut retarder l'exécution en pipeline d'instructions (de-pipeline), la CPU ne consomme pas trop de ressources pour la mise en œuvre, la mise en œuvre du temps de retard à charge, le temps de retard sur le nombre de processeurs est égal à zéro. Il peut éviter une deuxième boucle de sortie lorsque l'ordre en raison de conflits de mémoire (violation de l'ordre de mémoire) causées par pipeline CPU est effacée (pipeline CPU flush), afin d'améliorer l'efficacité de la CPU.
- opération atomique ne peut garantir une variable partagée
CAS valide que pour une seule variable partagée, lorsque l'opération implique une pluralité de variables partagées à travers invalide CAS. Mais dès le début de JDK 1.5, fournit la classe AtomicReference pour assurer des références atomicité entre les objets, vous pouvez mettre plusieurs variables sur un objet dans le CAS pour fonctionner, afin que nous puissions utiliser le multiple de verrouillage ou de l'utilisation des variables partagées comme AtomicReference combinées en une variable partagée à utiliser.
5,5 mécanisme de verrouillage InnoDB et algorithme de verrouillage
moteur de stockage MyISAM et InnoDB à utiliser des verrous:
- MyISAM utilise verrou au niveau de la table (verrouillage au niveau de la table).
- InnoDB supporte le verrouillage de niveau ligne (verrouillage de ligne) et le verrouillage au niveau de la table, par défaut à verrouillage de ligne
Table de verrouillage de niveau et de niveau ligne verrouille la comparaison:
- serrure niveau de la table: Mysql bloquée dans une taille maximale des particules de la serrure, l'opérationcours de la serrure entière de table, simple,consommation des ressources est relativement faible, verrouillage rapide,impasse ne se produira pas. Son conflit de verrouillage de déclenchement de verrouillage de taille maximale plus haut degré minimum de probabilité de concomitance,moteurs MyISAM et InnoDB supportentverrouillage de table.
- serrures de ligne: Mysql verrouillage de granularitéplus petit dans une serrure pouropérationverrouillage uniquement pour la ligne actuelle. conflit de verrouillage de ligne peut réduire considérablementopérations de base de données. Verrouillagesa taille minimale, haute concurrence, mais aussi la plus grande tête de verrouillage,verrouillage lent, il y aura une impasse. Les détails peuventréférer à: mécanisme de verrouillage Mysql est simple regard
moteur de stockage InnoDB algorithme de verrouillage, il y a trois:
- serrure enregistrement: verrous surlignes individuelles
- verrouillage Gap: blocage deécart, une plage de verrouillage, les documents euxmêmes ne sont pas inclus
- Key-Lock la suivante: Enregistrer une plage de verrouillage + GAP, comprenant les documents euxmêmes
Connaissance Point:
- Pour les requêtes utilisant la ligne InnoDB de verrou de clé
- la saisie suivante verrouillage afin de résoudre le problème de lecture fantôme Phantom problème
- Lorsque la requête d'index contient un attribut unique, le verrou de clé rétrogradé pour enregistrer la clé
- objectif de conception de verrouillage Gap est d'empêcher plusieurs transactions à insérer des enregistrements dans la même gamme, et cela conduira à des problèmes de lecture fantôme
- Il y a deux façons de combler l'écart de verrouillage explicite :( addition des contraintes clés uniques et étrangères contrôles, en utilisant uniquement le verrou d'enregistrement restant) A. Le niveau d'isolation des transactions est réglé sur RC B. Le paramètre est réglé sur 1 innodb_locks_unsafe_for_binlog
5.6 verrou partagé et verrou exclusif
- verrou partagé (verrouillage S) également connu comme un verrou de lecture, si l'objetdonnées de transaction A plus T serrure S, ne peut êtretransactionlecture T A; autres opérations ne peuvent verrouillernouveau un plus S, ainsiX ne peut pas verrouiller, S T jusqu'à ce que le verrou est libéré sur. Cela garantit queautres transactions peuvent être lus A, mais pas apporter de modifications avant le verrou du T A S sur A.
- verrou exclusif (verrou exclusif, en abrégé verrouillage X): également connu sousnomun verrou d'écriture, si les données de transaction objet T à A plus verrou X, ne permet T à lire etmodifier A, aucune autre opération ne peut plus sur A ajouter tout type de serrure, de libération jusqu'à ce que T a. Il empêche toute autre opération d'acquérir le verrou sur la ressource jusqu'à la fin deserrureorigine de la transaction sur les ressources libérées. Au coursopérations de misejour (INSERT, UPDATE ou DELETE) applique toujours un verrou exclusif.
La différence entre les deux:
- serrures Partager (serrures S): Si les données de transaction T à A plus verrou partagé,autres transactions ne peuvent verrouilleractionplus un ne peut pas ajouterverrou exclusif. Acquire partagée affaires serrures ne peut liredonnées, les données ne peuvent pas être modifiées.
- verrou exclusif (verrouillage X): Si les données de transaction T à A plus verrou exclusif,autres transactions ne peuvent être appliquées à tout du bloc A de tout type. Les données de transaction acquis verrou exclusif ne peut pas lire seulement, mais aussi de modifier les données