How MySQL5.7 new feature rocks your heart
新增特性
种类 | 特性名称 | 备注 | 相关链接 |
---|---|---|---|
Performance&Scalability | online rename index | inplace方式,针对所有引擎 | alter index |
Performance&Scalability | online alter varchar | [0~255]是inplace修改,[256 ~ 256+] 是inplace修改 | online alter varchar |
Performance&Scalability | innochecksum | 增强版本的innochecksum | innochecksum,Improving Innochecksum,deep innochecksum |
Performance&Scalability | innodb_buffer_pool_dump_pct | - | innodb_buffer_pool_dump_pct |
Performance&Scalability | multi page cleaner | innodb_page_cleaners | innodb_page_cleaners |
Performance&Scalability | online DDL for optimize, alter engine=innodb | inplace的方式优化表 | online ddl |
Performance&Scalability | 可传输表空间 | - | 可传输表空间 |
Performance&Scalability | buffer_pool动态调整 | innodb_buffer_pool_size | Configuring InnoDB Buffer Pool Size Online |
Performance&Scalability | 创建所有和重建索引的时候使用bulk load | sorted index build,innodb_fill_factor | Sorted Index Builds |
Performance&Scalability | 缩小undo空间 | innodb_undo_log_truncate | Truncating Undo Logs |
Performance&Scalability | general tablespaces | - | InnoDB General Tablespaces |
Performance&Scalability | show_compatibility_56 | 兼容5.6参数用法 | Migrating to Performance Schema System and Status Variable Tables |
Replication improvements | Master dump thread improvements | 提升dump thread,减少锁竞争,增大吞吐量 | improvements |
Replication improvements | Changing the replication master without STOP SLAVE | 在线change master | CHANGE MASTER,Switching Masters During Failover |
Replication improvements | Multi-source replication | 多源复制 | Multi-Source Replication |
Replication improvements | Group Replication | - | SQL Statements for Controlling Group Replication,Group Replication |
Replication improvements | online GTID | - | - |
Replication improvements | multi-threaded replication | - | - |
Replication improvements | lossless semi-sync replication | - | - |
Performance Schema | sys schema增强版 | 包含了一些列ps的操作 | sys schema |
Optimizer | explain增强 | 可以根据connection_id查看 | explain connection |
Optimizer | hint增强 | optimizer_switch | hints |
JSON support | 提供JSON支持 | NoSQL扩展 | JSON |
Security | 密码过期策略 | - | Password Expiration Policy |
Security | 账号锁定 | - | account-locking |
Security | mysql初始化 | 1,只创建root@local用户 2,不创建test库 | initial |
Security | 支持SSL连接 | 更加安全 | SSL |
Other | Generated Columns | 虚拟列 | CREATE TABLE and Generated Columns |
Other | mysql client增强 | ctrl+c 终止操作,但是不会退出终端 | ctrl+c |
Other | 数据库重命名 | --rewrite-db | rewrite dbname |
新特性描述
Performance & Scalability: innoDB可伸缩性增强,临时表的性能,快速的online操作以及bulk load
JSON Support: JSON的支持,可以让RDB和NoSQL结合,让其更加灵活
Replication improvements: multi-source replication, multi-threaded slave enhancements, online GTIDs, and enhanced semi-sync replication 超级特性
Performance Schema: new SYS Schema 可以更加全面和底层的了解到数据库的性能
Security: MySQL5.7的新特性可以让数据库更加安全
Optimizer: 在解析器,优化器,代价模型上重构了大量的代码。并且在管理性,扩展性,性能方面得到了大量的提升
GIS: 地理位置查询,支持InnoDB spatial索引
移除的特性
- YEAR(2) Limitations and Migrating to YEAR(4)
- storage_engine 用 default_storage_engine 替换
- 去除thread_concurrency 参数
- 去除 timed_mutexes 参数
- alter table 不在有 ignore语句
- insert delayed 不在支持
- mysql_upgrade 不在支持--basedir,--datadir,--tmpdir
- SHOW ENGINE INNODB MUTEX 废除
- innodb_monitor,innodb_lock_monitor废除,代替的是: innodb_status_output, innodb_status_output_locks
- innodb_use_sys_malloc and innodb_additional_mem_pool_size 废除
- innodb_log_checksum_algorithm废除
关键特性详解
Adding JSON Support to MySQL
a. 随着JSON被MySQL支持,就可以将NoSQL的灵活性与关系型数据库的长处结合起来,强大的一塌糊涂
b. JSON 数据类型已经被支持,源生的JSON支持让MySQL与JSON更加紧密联系
Generated Columns & Indexable Virtual Columns
a. Generated列和普通的列是不一样的,该列用户不能插入值,但是可以根据用户定义的table definition,通过表达式由其他regular列计算而来
b. Generated column 可以被物化,也可以不被物化。物化的列,可以真实的存储下来(stored)。不被物化的列,我们叫它虚拟列(virtual)
d. 除此之外, 目前已经支持对虚拟列创建二级索引,这样可以更快的检索获取虚拟列的数据
e. 虚拟列的实现是这样的:他们并不会存在主键记录里面,但是他们的metadata已经在InnoDB 系统表和metadata cache里面注册
f. 虚拟列的好处:1,灵活 2,节省空间 3,增加和删除虚拟列不需要rebuild table
g. 虚拟列的缺点:1,由于列值不被物化,查询检索的速度没有普通列快
h. 但是,虚拟列值现在可以被物化到二级索引中,那么查询速度就会快很多。这样就大大提升了虚拟列的实用价值
i. 不仅如此,在虚拟列上创建索引也是ONLINE的啦
z. 关于generated column 官方博客: http://mysqlserverteam.com/generated-columns-in-mysql-5-7-5/
Performance & Scalability
性能和可伸缩性一直都是MySQL的重点优化对象
在InnoDB read-only(RO)方面,通过不断地迭代研发,让server层的connection处理更加快速
在InnoDB read-write(RW)方面,改善了很多internal的操作(如:flushing/purging 更加快速和稳定),以及快速的bulk 数据导入
- InnoDB Read-Only Scalability
a. 在RO中,涉及到Meta Data Locking(MDL)相关的竞争,在server层我们都移除了。
b. 对于InnoDB,THR_LOCK lock也移除了
z1. MySQL Performance: reaching 500K QPS with MySQL 5.7 : http://dimitrik.free.fr/blog/archives/09-01-2013_09-30-2013.html
z2. MySQL 5.7 : Over 1M QPS with InnoDB Memcached Plugin : http://mysqlserverteam.com/mysql-5-7-over-1m-qps-with-innodb-memcached-plugin/
z3. Transaction life cycle improvements in 5.7.3 : http://mysqlserverteam.com/transaction-life-cycle-improvements-in-5-7-3/
z4. MySQL 5.7.3: Deep dive into 1mil QPS with InnoDB Memcached : http://mysqlserverteam.com/mysql-5-7-3-deep-dive-into-1mil-qps-with-innodb-memcached/
- InnoDB Read-Write Scalability
a. 移除了InnoDB index lock 竞争
b. 何为index lock呢?顾名思义,就是DML中会在整个index tree 结构上加index 锁,现在改进为在block中加锁,这样粒度更加细了
z. MySQL-5.7 improves DML oriented workloads: http://mysqlserverteam.com/mysql-5-7-improves-dml-oriented-workloads/
- InnoDB Faster & Parallel Flushing
a. 当批量flush的时候,减少页的扫描来加速页的刷新
b. 页扫描复杂度由原来的O(n*n) 变成 O(n)
c. 现在还有多线程刷新机制,以前的刷新线程的拼接不复存在
d. 另外还修改了自适应刷新算法和机制来或者更大的一致性以及更平滑的吞吐量
- Speeding up Connection Handling
a. 在一些短生命周期的应用中,如:PHP,也许一个连接只执行一个query。意味着大部分时间都花在了创建和关闭连接上,很浪费
b. 在5.7中,我们降低了线程初始化和连接初始化的负载,比5.6 多了一倍的处理能力,从原来的26k每秒到现在的56k每秒
z. Improving connect/disconnect performance: http://mysqlserverteam.com/improving-connectdisconnect-performance/
- Bulk Data Load Improvements
a. Bulk load 主要是为了创建索引
b. 现在可以bulk sorted index build,因此,创建索引会非常快
c. 以前的版本,MySQL只能一个一个记录的在基础表上扫描和创建索引,然后现在,可以一次读取多个记录并排序
Online Operations
a. "Always ON" 一直以来都是web 解决方案的艺术追求最基本的特点
b. 对于DBA和开发来说,调优和扩展生产系统的时候服务不受打断太重要了
c. GTID现在可以online了,所以可以在线切换,不受任何影响
d. innodb_buffer_pool_size 可以动态调整,也是online的
e. 如果你配置了独立的UNDO表空间,那么truncate undo logs 是自动的,而别不会对线上服务有影响,这样可以避免undo无限增大
f. 索引重命名也支持online
g. 增大varchar 也可以online,但是有条件限制。 0~255 范围内调整online,256 ~ 256+ 范围内 online,不能跨越两个尺寸的增长
h. CHANGE REPLICATION FILTER 是online 动态的,不需要停机
i. CANGE MASTER TO限制也可以支持online 动态,不需要stop slave了
z1. Enabling Global Transaction Identifiers Without Downtime in MySQL 5.7.6 : http://mysqlhighavailability.com/enabling-gtids-without-downtime-in-mysql-5-7-6/
z2. Resizing the InnoDB Buffer Pool Online : http://mysqlserverteam.com/resizing-buffer-pool-online/
z3. MySQL-5.7.3- Making MySQL Slave Replication Filters Dynamic : http://mysqlserverteam.com/mysql-5-7-3-making-mysql-slave-replication-filters-dynamic/
Optimizer Improvements
a. Query重写插件: 用户可以自己写插件,在SQL执行前,重写query,非常方便
b. 对于small limit语句是否选择索引的代价变小了
c. In query 现在优化成使用range扫描,以前的版本是通过改写query成 and/or 实现
d. union all 不再创建tempory表
e. Non-sorted 非排序字段现在在sort buffer中是压缩过的,这样可以最大利用sort buffer
f. explain 现在可以在执行的query上跑,explain for connection
g. JSON explain 已经支持
z1. Write Yourself a Query Rewrite Plugin: Part 1 : http://mysqlserverteam.com/write-yourself-a-query-rewrite-plugin-part-1/
z2. Write Yourself a Query Rewrite Plugin: Part 2 : http://mysqlserverteam.com/write-yourself-a-query-rewrite-plugin-part-2/
z3. MySQL EXPLAIN Explained: http://mysqlserverteam.com/mysql-explain-explained/
Parser Refactoring
a. 由于原来老的SQL解析器限制太多,不易于维护和扩展。
b. 之前做了很多预备工作,比如:SELECT,DML 的重构。
c. 现在打算重写整个解析器
z1. SQL parser refactoring in 5.7.4 LAB release : http://mysqlserverteam.com/sql-parser-refactoring-in-5-7-4-lab-release/
Optimizer Refactoring
Work towards a New Cost Model
Page Compression
a. 透明页压缩在InnoDB层已经实现了
b. 这个特性可以在任何支持稀疏文件(sparse files)和 空洞(punch hole)的操作系统/文件系统
c. 通俗来讲就是:给你一个16k的页,你可以用你喜欢的算法去压缩,然后仅仅写入压缩后的数据。
d. 然后将这16k种没有用到的block以punch hole的形式再写回文件系统
InnoDB Fulltext Search
z1. InnoDB supports plugin parser in fulltext index : http://mysqlserverteam.com/innodb-supports-plugin-parser-in-fulltext-index/
z2. Rankings with InnoDB Full-Text Search : http://mysqlserverteam.com/rankings-with-innodb-full-text-search/
Performance Schema
a. 在数据库管理系统中,监控对于用户、顾客都是非常重要的.
b. Performance Schema 是我们在监控领域里面的一个核心战略,第一次是在5.5的时候哦引进
c. 5.7中,我们加入了 Metadata Locking (WL#5879), Transactions (WL#5864), Memory Usage (WL#3249, WL#7777), Stored Programs (WL#5766), and Prepared Statements
d. 5.7中,揭露更多show slave status的信息, show status 和 show variables的之间的兼容性
e. 5.7中,会打印出long query的处理过程进度报告
f. 对performance schema的对内分配做了改变,之前的版本会在MySQL启动的时候就分配所有ps需要的内容,现在做到动态分配,按需分配
g. 在setup_actors中新增enabled列,让user可以轻松和监控和不监控某些资源
h. 增加了两个实体来配置Query text 长度,SQL text和 digest , 默认是1024个bytes
z1. Performance Schema implementation Internals: Registering instruments : http://mysqlserverteam.com/performance-schema-implementation-internals-registering-instruments/
z2. MySQL Performance Schema : Prepared Statements Instrumentation : http://mysqlserverteam.com/mysql-performance-schema-prepared-statements-instrumentation/
z3. MySQL Performance Schema: Instrumentation Exceptions : http://mysqlserverteam.com/mysql-performance-schema-instrumentation-exceptions/
z4. MySQL Statement Digests : http://mysqlserverteam.com/mysql-statement-digests/
SYS Schema
a. SYS schema 是DBA的福音,他整合了Information_Schema , performance schema 以及更多来帮助DBA和开发来更简单的使用和配置ps
z. The MySQL SYS Schema in MySQL 5.7.7 : http://mysqlserverteam.com/the-mysql-sys-schema-in-mysql-5-7-7/
Fabric Support
Secure by Default
Security Features
InnoDB Native Partitioning
a. 现在InnoDB开始支持原生的分区表,之前都是依赖ha_partiion handler,意味着没创建一个分区表,都会创建一个新的handler,浪费资源
b. 现在InnoDB 分区表支持外键,全局二级索引,全文索引
c. 更强大的是:它还支持ICP,传输表空间
z. MySQL 5.7.4 now supports Transportable Tablespaces for InnoDB Partitions. : http://mysqlserverteam.com/mysql-5-7-4-now-supports-transportable-tablespaces-for-innodb-partitions/
InnoDB General Tablespaces
InnoDB Temporary Table Performance
a. 通过避免一些不必要的步骤(持久化临时表的metadata到磁盘)来将临时表的创建和去除更加的轻量级
b. 将临时表放到了单独的表空间中,这样恢复的时候就没必要走特别复杂的算法和过程,简单的re-created 就好
c. 临时表只有在创建它的connection和session中才能看到
d. 对于相关临时表的DML操作,移除了不必要的undo和redo,change buffering,locking等过程
e. 添加了新的undo log 类型,不需要redo 来记录
f. 这些non-redo-logged的undo log 在恢复过程中是不需要的,他们只负责rollback即可
g. 新增了一个特殊的临时表,叫做内部临时表(intrinsic tempory table),这种类型的临时表和普通临时表的区别就是:它没有复杂的acid和mvcc
h. 这种内部临时表用于支持内部模块的使用,比如:优化器的需求啦
z. MySQL 5.7: InnoDB Intrinsic Tables : http://mysqlserverteam.com/mysql-5-7-innodb-intrinsic-tables/
Buffer Pool—Dump and Load
a. 现在可以支持dump 线上热点数据的N%
b. load 操作现在也非常轻量级,因为是通过后台线程异步的方式导入进去的
c. 默认设置的是25%,这样既能很好的保持线上的热点数据,又能让shutdown和startup的速度不受影响
z1. MySQL Dumping and Reloading the InnoDB Buffer Pool : http://mysqlserverteam.com/mysql-dumping-and-reloading-the-innodb-buffer-pool/
Tools
- mysqlpump
a. mysqlpump 和 mysqldump 类似,但是并不是100%兼容
b. mysqlpump 最大的优点就是:可以多线程备份和恢复
- innochecksum
a. 对innochecksum 新增了很多实用的功能
b. 可以自己指定checksum的算法(innodb/crc32/none)
c. 可以对多表空间文件以及同一个表空间中的多个文件进行checksum
d. 还可以查看页的类型
z. Improving Innochecksum : http://mysqlserverteam.com/improving-innochecksum/
- mysqlbinlog
a. 可以支持远程读取binlog文件,通过SSL 安全连接的方式
Community Contributions
a. server-side 语句延迟功能在MySQL5.7.4 被引入,但是在5.7.13上面却没有看到这个功能
b. 只对SELECT语句有效果
c. 如果select的时间超过max_statement_time的阈值,那么就会被abort,非常实用的功能
z. Server-side SELECT statement timeouts: http://mysqlserverteam.com/server-side-select-statement-timeouts/
Triggers
IGNORE Clause
STRICT Mode
GIS: InnoDB Spatial Indexes
GIS: Geometry Functions & Formats
Multi-Source Replication
a. slave 现在可以同步多台master,并且之间没有冲突
b. 这样的应用场景就是:可以在slave进行数据整合和备份
z. MySQL-5.7.6: Introducing Multi-source replication : http://mysqlhighavailability.com/mysql-5-7-6-introducing-multi-source-replication/
Replication — Multi-Threaded Slaves (MTS)
a. 多线程复制,支持同一个库的并行
b. ordered commit 也已经实现,也就是保证顺序一致性。
c. slave并行执行的顺序和master并行是一致的
d. slave replication 支持自动重连,之前只支持单线程复制
e. 使用了一个更加聪明的算法来检测多线程事务之间的冲突(--slave-parallel-type=LOGICAL_CLOCK),意味着并发性能更好了
z. enhancedMTS : http://geek.rohitkalhans.com/2013/09/enhancedMTS-configuration.html
Semi-Sync Replication (lossless)
a. 增加了一个option,让master等待N(N>=1)个slave的ack。 之前只支持N=1
b. lossless之所以叫无损复制,那是因为等待的point不一样了,以前是after_commit,现在是after_sync.
c. 降低了semi-sync的延迟,现在是用独立的线程去发送和接受semi-sync ack,所以send和receive之间是可以同时的
z. lossless semi-sync : http://my-replication-life.blogspot.co.uk/2013/09/loss-less-semi-synchronous-replication.html
Replication — GTID (online)
a. 就像之前提到的那样,GTID支持online了,所以切换期间读写不受影响,server之间也不需要同步操作
b. 在之前的版本中,必须停掉所有写操作,所有server必须到同步到一个点,然后restart
z. Enabling Global Transaction Identifiers Without Downtime in MySQL 5.7.6 : http://mysqlhighavailability.com/enabling-gtids-without-downtime-in-mysql-5-7-6/
Replication — Refactoring
Other Replication Features
- SHOW SLAVE STATUS 不阻塞
- mysqlbinlog幂等模式
- mysqlbinlog重写DB
- replication的变量和参数已经加入到performance schema中
- GTIDs 存入InnoDB表中
- 增加参数: --binlog_group_commit_sync_delay,binlog_group_commit_sync_no_delay_count 让更多的事务加入到binlog的组提交队列中
Other Improvements
- ROW_FORMAT=DYNAMIC 成为默认
- PERFORMANCE_SCHEMA 中新增 THREADS.THREAD_OS_ID
- 在sys中打印出long query的进度报告
- 新增Information_Schema.Files
- InnoDB的填充因子可设置了
- 支持32k和64k页了
- 5.6到5.7可以更加平滑的升级了,以前是需要制定--skip-grant-tables
- 插件和系统表大部分都修改成innoDB了
- TRUNCATE TABLE 操作变成原子的了,意味着table_id 是同一个,不会新增了
- 新增参数:--disabled-storage-engines
- 新增参数:Super-read-only(super权限也无法操作) , 这个设置后,read-only 也会自动设置on
关键参数
参数名 | 备注 | 链接 |
---|---|---|
default_password_lifetime | - | default_password_lifetime |