在MySQL8.0之前,DDL操作在server crash的情况下,会遗留.frm,.ibd文件。MySQL8.0 能实现原?DDL(包括 DROP TABLE, DROP SCHEMA, CREATE TABLE, TRUNCATE TABLE, ALTER TABLE),在server crash的情况下,不会遗留.frm,.ibd临时文件,保证了DDL操作的原子性!
二 、字符集支持(Character set support)
数据库的默认字符集 latin1 到 utf8mb4 。

三、重构sql分析器,提升性能
改进SQL分析器。旧的分析器由于其语法复杂性和自顶向下的分析方式从而有严重的限制,导致难以维护和扩展。
四、onlineDDL 的巨大改进。8.0.12版本将会增加 ALGORITHM=INSTANT 方法。我们知道,mysql的对表结构的更改,一直让DBA头疼。目前有2两种ALGORITHM [=] {INPLACE|COPY} 。instant是比inplace方法更改,锁定表的时间更短。
五、innodb 增强,提升性能
(1)innodb_undo_tablespaces的最小值为2,并且不再允许将innodb_undo_tablespaces设置为0。 最小值2确保回滚段始终在撤消表空间中创建,而不是在系统表空间中创建
(2)InnoDB临时表都将在共享临时表空间ibtmp1中创建

六、调整back_log的默认值,保持和 max_connections一致,增强突发流量带来的连接处理容量。这告诉我们,有些参数是随着另外一个参数动态调整的。
新增innodb_dedicated_server,让InnoDB根据服务器上检测到的内存量自动配置innodb_buffer_pool_size,innodb_log_file_size,innodb_flush_method
-
原来是:来试验一下:
-
mysql> select * from `performance_schema`.global_variables where VARIABLE_NAME in ('innodb_dedicated_server','innodb_buffer_pool_size','innodb_buffer_pool_instances');
-
+------------------------------+----------------+
-
| VARIABLE_NAME | VARIABLE_VALUE |
-
+------------------------------+----------------+
-
| innodb_buffer_pool_instances | 1 |
-
| innodb_buffer_pool_size | 134450944 |
-
| innodb_dedicated_server | OFF |
-
+------------------------------+----------------+
-
3 rows in set (0.00 sec)
-
-
-
后来是
-
mysql> select * from `performance_schema`.global_variables where VARIABLE_NAME in ('innodb_dedicated_server','innodb_buffer_pool_size','innodb_buffer_pool_instances');
-
+------------------------------+----------------+
-
| VARIABLE_NAME | VARIABLE_VALUE |
-
+------------------------------+----------------+
-
| innodb_buffer_pool_instances | 8 |
-
| innodb_buffer_pool_size | 6442450944 |
-
| innodb_dedicated_server | ON |
-
+------------------------------+----------------+
-
3 rows in set (0.00 sec)
七、
在线修改系统变量后,会将修改后的值持久化到磁盘。他并不是持久化到my.cnf中,而且重新生成一个新的文件mysqld-auto.cnf,并将修改后的值保存到该文件中。mysqld-auto.cnf文件中的配置相比my.cnf文件具有高优先级,如果相同配置出现在两个文件中,就以mysqld-auto.cnf文件中的记录为主。
-
mysql> set persist autocommit=1;
-
Query OK, 0 rows affected (0.00 sec)
-
-
mysql>
八、对于开发人员来说,增加了窗口函数,with 语法,对于编写复杂的sql语句提供了强有力的支撑
九、InnoDB性能提升
废除buffer pool mutex,将原来一个mutex拆分成多个,提高并发
MySQL 8.0 版本开始支持期待已久直方图。优化器会利用column_statistics的数据,判断字段的值的分布,得到更准确的执行计划。
这些有很多的关于性能提升的数据,最后,我将用压力测试工具来实际压测一下,看看oracle公司有没有撒谎。
下面这些可能会比较长,慢慢压测:
(1)安装sysbench 1.0.9 ,自己百度,不是本章重点
(2)压测怎么少得了监控呢,按照PMM ,自己百度怎么安装。
(3)先做准备工作,看下机器环境:
普通的DELL 服务器R730 SAS 10K 。上面安装的vmware ,分配的一台普通的虚拟机。操作系统: redhat7,4核8G内存,是不是很普通的一台机器呢?相当普通的一台机器
-
[root@yw-gz-hd-test-211 mysql]# uname -a
-
Linux yw-gz-hd-test-211 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
-
[root@yw-gz-hd-test-211 mysql]# free -m
-
total used free shared buff/cache available
-
Mem: 7680 4107 131 8 3441 3242
-
Swap: 0 0 0
-
-
processor : 3
-
vendor_id : GenuineIntel
-
cpu family : 6
-
model : 79
-
model name : Intel(R) Xeon(R) CPU E5-2640 v4 @ 2.40GHz
-
stepping : 1
-
microcode : 0xb000021
-
cpu MHz : 2399.318
-
cache size : 25600 KB
-
physical id : 6
-
siblings : 1
-
core id : 0
-
cpu cores : 1
-
apicid : 6
-
initial apicid : 6
-
fpu : yes
-
fpu_exception : yes
-
cpuid level : 13
-
wp : yes
-
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts nopl xtopology tsc_reliable nonstop_tsc eagerfpu pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 invpcid rtm rdseed adx smap xsaveopt arat
-
bogomips : 4799.99
-
clflush size : 64
-
cache_alignment : 64
-
address sizes : 43 bits physical, 48 bits virtual
-
power management:
(4)来看下我们压测的mysql
-
[root@yw-gz-hd-test-211 ~]# mysql -uroot -p123456
-
mysql: [Warning] Using a password on the command line interface can be insecure.
-
Welcome to the MySQL monitor. Commands end with ; or \g.
-
Your MySQL connection id is 218
-
Server version: 8.0.11 Source distribution
-
-
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
-
-
Oracle is a registered trademark of Oracle Corporation and/or its
-
affiliates. Other names may be trademarks of their respective
-
owners.
-
-
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
-
-
mysql> select version();
-
+-----------+
-
| version() |
-
+-----------+
-
| 8.0.11 |
-
+-----------+
-
1 row in set (0.00 sec)
(5)进行数据准备。我们使用默认安装的默认参数。这次压测的数据量是这样的:10个表,每个表500万数据,每个表有1.2G大小。这样的数据量,针对一个中等规模的应用,很典型了。然后,压测有增删改查,比例是这样的:
-
[root@yw-gz-hd-test-211 ~]# sysbench /usr/share/sysbench/oltp_read_write.lua --db-driver=mysql --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-db=sbtest --mysql-user=root --mysql-password=123456 --table_size=5000000 --tables=10 --threads=30 --time=60 --report-interval=30 prepare
-
sysbench 1.0.9 (using system LuaJIT 2.0.4)
-
-
Initializing worker threads...
-
-
Creating table 'sbtest3'...
-
Creating table 'sbtest8'...
-
Creating table 'sbtest2'...
-
Creating table 'sbtest6'...
-
Creating table 'sbtest7'...
-
Creating table 'sbtest1'...
-
Creating table 'sbtest4'...
-
Creating table 'sbtest10'...
-
Creating table 'sbtest9'...
-
Creating table 'sbtest5'...
-
Inserting 5000000 records into 'sbtest9'
-
Inserting 5000000 records into 'sbtest2'
-
Inserting 5000000 records into 'sbtest6'
-
Inserting 5000000 records into 'sbtest10'
-
Inserting 5000000 records into 'sbtest8'
-
Inserting 5000000 records into 'sbtest3'
-
Inserting 5000000 records into 'sbtest1'
-
Inserting 5000000 records into 'sbtest7'
-
Inserting 5000000 records into 'sbtest4'
-
Inserting 5000000 records into 'sbtest5'
-
Creating a secondary index on 'sbtest7'...
-
Creating a secondary index on 'sbtest2'...
-
Creating a secondary index on 'sbtest1'...
-
Creating a secondary index on 'sbtest9'...
-
Creating a secondary index on 'sbtest6'...
-
Creating a secondary index on 'sbtest4'...
-
Creating a secondary index on 'sbtest8'...
-
Creating a secondary index on 'sbtest3'...
-
Creating a secondary index on 'sbtest5'...
-
Creating a secondary index on 'sbtest10'...
现在每个表有500万数据,插入还挺快的,我们来看看linux的具体容量有多少?
-
[root@yw-gz-hd-test-211 mysql]# ls
-
auto.cnf business ibtmp1 server-cert.pem yw-gz-hd-test-211-bin.000006
-
binlog.000001 ca-key.pem mysql server-key.pem yw-gz-hd-test-211-bin.000007
-
binlog.000002 ca.pem mysqld-auto.cnf sys yw-gz-hd-test-211-bin.000008
-
binlog.000003 client-cert.pem mysql.ibd undo_001 yw-gz-hd-test-211-bin.000009
-
binlog.000004 client-key.pem off.000001 undo_002 yw-gz-hd-test-211-bin.index
-
binlog.000005 error.log off.index yw-gz-hd-test-211-bin.000001 yw-gz-hd-test-211.err
-
binlog.000006 ib_buffer_pool performance_schema yw-gz-hd-test-211-bin.000002 yw-gz-hd-test-211.log
-
binlog.000007 ibdata1 private_key.pem yw-gz-hd-test-211-bin.000003 yw-gz-hd-test-211.pid
-
binlog.000008 ib_logfile0 public_key.pem yw-gz-hd-test-211-bin.000004 yw-gz-hd-test-211-slow.log
-
binlog.index ib_logfile1 sbtest yw-gz-hd-test-211-bin.000005
-
[root@yw-gz-hd-test-211 mysql]# ls sbtest/ -lh
-
total 12G
-
-rw-r----- 1 mysql mysql 1.2G Jul 4 17:53 sbtest10.ibd
-
-rw-r----- 1 mysql mysql 1.2G Jul 4 17:53 sbtest1.ibd
-
-rw-r----- 1 mysql mysql 1.2G Jul 4 17:53 sbtest2.ibd
-
-rw-r----- 1 mysql mysql 1.2G Jul 4 17:53 sbtest3.ibd
-
-rw-r----- 1 mysql mysql 1.2G Jul 4 17:53 sbtest4.ibd
-
-rw-r----- 1 mysql mysql 1.2G Jul 4 17:53 sbtest5.ibd
-
-rw-r----- 1 mysql mysql 1.2G Jul 4 17:53 sbtest6.ibd
-
-rw-r----- 1 mysql mysql 1.2G Jul 4 17:53 sbtest7.ibd
-
-rw-r----- 1 mysql mysql 1.2G Jul 4 17:53 sbtest8.ibd
-
-rw-r----- 1 mysql mysql 1.2G Jul 4 17:53 sbtest9.ibd
-
[root@yw-gz-hd-test-211 mysql]#
(6)
(7)
(8)
(9)
(10)
(11)
(12)
(13)