MySQL est un système de gestion de petites bases de données relationnelles open source développé par la société suédoise MySQL AB. Actuellement, MySQL est largement utilisé sur les sites Web de petite et moyenne taille sur Internet. En raison de sa petite taille, de sa vitesse rapide, de son faible coût total de possession et surtout des caractéristiques de l'open source, de nombreux sites Web de petite et moyenne taille choisissent MySQL comme base de données de site Web afin de réduire le coût total de possession d'un site Web.
L'équipe de développement MySQL a annoncé la sortie de la version MySQL 8.0.0 (DMR) le 12 ! Certaines personnes pourraient être surprises de savoir pourquoi MySQL est passé de 5.x à 8.0. En fait, la série MySQL 5.x existe depuis de nombreuses années. Elle était 5.1 avant l'acquisition par Oracle, et elle a été maintenue à 5.x depuis l'acquisition, comme 5.5, 5.6, 5.7 et ainsi de suite. En fait, si vous suivez le rythme de sortie original, vous pouvez considérer la version 5.6.x comme 6.x et la version 5.7.x comme 7.x. Par conséquent, nous venons de modifier la méthode de dénomination des versions.
Cependant, la version de développement MySQL 8.0.0 publiée cette fois présente encore de nombreux points forts.
Points forts de MySQL 8.0.0
Dictionnaire de données transactionnelles, complètement séparé du moteur de stockage MyISAM
Mettez vraiment le dictionnaire de données dans certaines tables d'InnoDB, et non plus FRM, Les fichiers TRG, PAR sont nécessaires ! Le schéma d'information apparaît désormais sous la forme d'une vue des tables du dictionnaire de données. En principe, le type de table de données MyISAM n'est pas du tout nécessaire et toutes les tables système peuvent être placées dans InnoDB.
Rôle SQL
Un rôle est un ensemble d'autorisations. Vous pouvez créer des rôles, accorder et supprimer des rôles à un utilisateur. Ceci est pratique pour la gestion des autorisations.
Le jeu de caractères utf8mb4 deviendra le jeu de caractères par défaut et prendra en charge Unicode 9
Le jeu de caractères par défaut passera de latin1 à utf8mb4, et le classement par défaut passera de latin1_swedish_ci à utf8mb4_800_ci_ai.
Index invisibles
Certains index peuvent être définis comme invisibles afin que l'optimiseur SQL ne les utilise pas, mais ils continueront à être mis à jour en arrière-plan. La visibilité peut être rétablie à tout moment lorsque cela est nécessaire.
Les opérations sur les bits peuvent être effectuées sur des données binaires
Non seulement les opérations sur les bits peuvent être effectuées sur BIGINT, mais à partir de la version 8.0, les opérations sur les bits sur [VAR]BINARY/[TINY|MEDIUM|LONG] Les BLOB sont également pris en charge.
Les opérations améliorées sur IPv6 et UUID
INET6_ATON() et INET6_NTOA() peuvent désormais effectuer des opérations sur bits, car INET6_ATON() renvoie désormais le type de données VARBINARY(16) (128 bits). Les opérations UUID ont été améliorées et trois nouvelles fonctions UUID_TO_BIN(), BIN_TO_UUID() et IS_UUID() ont été introduites. MySQL n'a pas de types de données IPv6 et UUID spéciaux, mais est stocké dans le type de données VARBINARY(16).
Variables globales persistantes
Vous pouvez utiliser SET PERSIST pour définir des variables globales persistantes, qui seront conservées même si le serveur est redémarré.
Améliorations du schéma de performance de la base de données de performances
Par exemple, plus de 100 index ont été ajoutés à la base de données de performances pour permettre une récupération plus rapide.
Refactoriser l'analyseur SQL
Améliorer continuellement et progressivement l'analyseur SQL. L'ancien analyseur présentait de sérieuses limitations en raison de sa complexité syntaxique et de son approche d'analyse descendante, ce qui le rendait difficile à maintenir et à étendre.
Modèle de coût
Les tampons InnoDB peuvent désormais estimer le nombre de tables et d'index se trouvant dans le cache mémoire principal, ce qui permet à l'optimiseur de savoir si les données peuvent être stockées en mémoire ou non lors du choix d'un méthode d’accès. Doit être stocké sur le disque.
Histogrammes
En utilisant des histogrammes, les utilisateurs ou les administrateurs de base de données peuvent établir des statistiques sur la distribution des données, qui peuvent être utilisées pour l'optimisation des requêtes afin de trouver des solutions de requête optimisées.
Amélioration des performances d'analyse
Amélioration des performances de la requête de plage InnoDB, ce qui peut améliorer les performances de la requête de table complète et de la requête de plage de 5 à 20 %.
Reconstruction de BLOB
La reconstruction de BLOB accélère les opérations de lecture/mise à jour des fragments et peut accélérer les opérations de données JSON.
Valeur d'auto-incrémentation persistante
InnoDB conservera la valeur maximale de la séquence d'auto-incrémentation dans le journal de rétablissement. Cette amélioration corrige également un très ancien bug numéro 199.
Tables temporaires
Supprimez la prise en charge des tables temporaires compressées et stockez les métadonnées des tables temporaires en mémoire.
Pour des améliorations et des détails plus importants, veuillez vous référer à l'annonce de la version MySQL 8.0.0 [1] et ici [2].
Télécharger
Actuellement, la version 8.0.0 est toujours une version de développement. Si vous souhaitez découvrir et tester les dernières fonctionnalités, vous pouvez télécharger les packages d'installation pour chaque plate-forme depuis dev.mysql.com[. 3]. Cependant, le progiciel MySQL devient de plus en plus volumineux et le package binaire sur la plate-forme Linux fait près de 1 Go. Si vous l'utilisez dans un environnement de production, veuillez continuer à utiliser la série 5.7 avant que la version 8.0 n'entre dans la version stable. La dernière version est la version 5.7.15 GA - qui ne fait que plus de 600 M.
Le dernier code source est sur GitHub. Les amis intéressés peuvent le consulter. Beaucoup d'entre eux sont des contributions de Chinois.
À partir de MySQL 8.0, la fonctionnalité d'index caché, également connue sous le nom d'index invisible, est prise en charge. Pour les index invisibles, l'optimiseur les ignorera simplement. Nous pouvons influencer le comportement de l'optimiseur grâce à cette fonctionnalité. De plus, cela peut également être considéré comme un tampon avant de supprimer un index. Après avoir temporairement défini l'index pour qu'il soit invisible, observez si l'application est normale ou s'il y a une erreur ou quelque chose du genre. Si tout va bien, supprimez-la enfin. .
Note de version correspondante de la version 8.0.0 :
Tests
# 创建一个普通的表t1,只带主键 mysql> create table t1 (a int primary key auto_increment, b int, c int, d int); Query OK, 0 rows affected (0.67 sec) # 增加一个索引 mysql> alter table t1 add key(b); Query OK, 0 rows affected (0.06 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> show indexes from t1\G *************************** 1. row *************************** Table: t1 Non_unique: 0 Key_name: PRIMARY Seq_in_index: 1 Column_name: a Collation: A Cardinality: 0 Sub_part: NULL Packed: NULL Null: Index_type: BTREE Comment: Index_comment: Visible: YES *************************** 2. row *************************** Table: t1 Non_unique: 1 Key_name: b Seq_in_index: 1 Column_name: b Collation: A Cardinality: 0 Sub_part: NULL Packed: NULL Null: YES Index_type: BTREE Comment: Index_comment: Visible: YES 2 rows in set (0.01 sec) 从show indexes的visible列显示了,这两个索引都是可见的。 # Load some data insert into t1 select NULL, rand()*100000, rand()*10000,rand()*10000; insert into t1 select NULL, rand()*100000, rand()*10000,rand()*10000 from t1; insert into t1 select NULL, rand()*100000, rand()*10000,rand()*10000 from t1; .... analyze table t1; mysql> explain select * from t1 where b > 5000 limit 10; +----+-------------+-------+------------+-------+---------------+------+---------+------+------+----------+-----------------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-------+------------+-------+---------------+------+---------+------+------+----------+-----------------------+ | 1 | SIMPLE | t1 | NULL | range | b | b | 5 | NULL | 1932 | 100.00| Using index condition | +----+-------------+-------+------------+-------+---------------+------+---------+------+------+----------+-----------------------+ 1 row in set, 1 warning (0.00 sec 可以看到索引b被使用到 # 修改索引b为不可见 mysql> alter table t1 alter index b invisible; Query OK, 0 rows affected (0.05 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> show indexes from t1\G *************************** 1. row *************************** Table: t1 Non_unique: 0 Key_name: PRIMARY Seq_in_index: 1 Column_name: a Collation: A Cardinality: 2048 Sub_part: NULL Packed: NULL Null: Index_type: BTREE Comment: Index_comment: Visible: YES *************************** 2. row *************************** Table: t1 Non_unique: 1 Key_name: b Seq_in_index: 1 Column_name: b Collation: A Cardinality: 2029 Sub_part: NULL Packed: NULL Null: YES Index_type: BTREE Comment: Index_comment: Visible: NO 2 rows in set (0.01 sec) mysql> explain select * from t1 where b > 5000 limit 10\G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: t1 partitions: NULL type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 2048 filtered: 33.33 Extra: Using where 1 row in set, 1 warning (0.00 sec) 当索引被修改为invisible后,优化器将不再选择这个索引 # 将索引重新修改为可见 mysql> alter table t1 alter index b visible; Query OK, 0 rows affected (0.05 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> explain select * from t1 where b > 5000 limit 10\G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: t1 partitions: NULL type: range possible_keys: b key: b key_len: 5 ref: NULL rows: 1932 filtered: 100.00 Extra: Using index condition 1 row in set, 1 warning (0.00 sec) # 你也可以在创建索引的时候显式指定是否可见 mysql> alter table t1 add key(c) invisible; Query OK, 0 rows affected (0.12 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> show indexes from t1 where key_name = 'c'\G *************************** 1. row *************************** Table: t1 Non_unique: 1 Key_name: c Seq_in_index: 1 Column_name: c Collation: A Cardinality: 1848 Sub_part: NULL Packed: NULL Null: YES Index_type: BTREE Comment: Index_comment: Visible: NO 1 row in set (0.01 sec) # 或者在建表时指定关键字 mysql> create table t2 (a int primary key, b int, key(b) invisible); Query OK, 0 rows affected (0.67 sec) # 但primary key不可以设置为不可见 mysql> drop table t2; Query OK, 0 rows affected (0.03 sec) mysql> create table t2 (a int, b int, primary key(a) invisible); ERROR 3522 (HY000): A primary key index cannot be invisible