Maison  >  Article  >  base de données  >  mysql8.0 arrive

mysql8.0 arrive

伊谢尔伦
伊谢尔伦original
2017-02-07 16:33:254996parcourir

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.

mysql8.0 arrive

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 :

mysql8.0 arrive

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


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