AliSQL特性

Posted _雪辉_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AliSQL特性相关的知识,希望对你有一定的参考价值。


AliSQL:100%兼容MySQL 充分发掘开源MySQL内核潜力

一、实用性

SQL Statement Outline

在线固化执行计划,相对于mysql原生hint强制索引的语法,对代码无侵入,DBA可动态调控

Ø DBMS_OUTLN.add_index_outline();增加 index hint
Ø DBMS_OUTLN.add_optimizer_outline();增加 optimizer hint 

Ø DBMS_OUTLN.preview_outline();预览某一个 SQL 语句命中 outline 的情况
Ø DBMS_OUTLN.show_outline(); 展示内存中可用的所有 outline 及命中情况
Ø DBMS_OUTLN.del_outline(); 删除内存和持久化表中的 outline
Ø DBMS_OUTLN.flush_outline();刷新所有的 outline,从 mysql.outline 表中重新 load 

Sequence Engine

在持久化数据库系统中,单调递增的唯一值是常见的需求。不同的数据库系统有不同的实现方法,例如MySQL提供的AUTO_INCREMENT,Oracle、SQL Server提供的SEQUENCE。

在MySQL数据库中,如果业务希望封装唯一值,例如增加日期、用户等信息,使用AUTO_INCREMENT的方法会带来很大不便,在实际的系统设计中,也存在不同的折中方法:

序列值由Application或者Proxy来生成,不过弊端很明显,状态带到应用端会增加扩容和缩容的复杂度。
序列值由数据库通过模拟的表来生成,但需要中间件来封装和简化获取唯一值的逻辑。
AliSQL提供了Sequence Engine,Sequence Engine实现了MySQL存储引擎的设计接口,但底层的数据仍然使用现有的存储引擎,例如InnoDB或者MyISAM来保存持久化数据,兼容现有的第三方工具(例如Xtrabackup),所以Sequence Engine仅仅是一个逻辑引擎。

mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
| FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
| Sequence           | YES     | Sequence Storage Engine Helper                                 | NO           | NO   | NO         |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
10 rows in set (0.00 sec)

Performance Agent&Performance Insight

提供了操作系统、server层、引擎层、对象语句级别的多维度监控

SQL Audit Log

SQL执行日志包括了对数据库进行的所有SQL操作,RDS提供的SQL执行日志,通过网络监听的方式收集,对实际执行几乎没有性能的影响,包括但不限于如下类型的SQL执行以及信息提取:

数据库的登入、登出
DDL(Data Definition Language):基于SQL的对数据库结构定义的SQL,例如CREATE、ALTER DROP、TRUNCATE、COMMENT等
DML(Data Manipulation Language):SQL操作语句,包括SELECT、INSERT、UPDATE、DELETE等
其他SQL执行,包括任何其他通过SQL执行的控制,例如回滚、控制等
失败的SQL执行也会被记录
对SQL执行的延迟、执行结果、影响的行数等信息的提取

Returning Statement

支持DML返回写入/更新后和删除前的数据

Faster DDL

优化了Buffer Pool页面管理策略,大幅减少DDL操作导致的锁争用

二、稳定性

Concurrent Control

为了应对突发的数据库请求流量、资源消耗过高的语句访问以及SQL访问模型的变化, 保证MySQL实例持续稳定运行,阿里云提供基于语句规则的并发控制CCL(Concurrency Control),并提供了工具包(DBMS_CCL)便于您快捷使用。

BP Optimization

Large File Purge

使用InnoDB引擎时,直接删除大文件会导致文件系统出现严重的稳定性问题,因此InnoDB会启动一个后台线程来异步清理数据文件。当删除单个表空间时,会将对应的数据文件先重命名为临时文件,然后清除线程将异步、缓慢地清理文件。

Thread Pool

MySQL默认的线程使用模式是会话独占模式,每个会话都会创建一个独占的线程。当有大量的会话存在时,会导致大量的资源竞争,大量的系统线程调度和缓存失效也会导致性能急剧下降。阿里云提供线程池(Thread Pool)功能,将线程和会话分离,在拥有大量会话的同时,只需要少量线程完成活跃会话的任务即可。

阿里云RDS的线程池实现了不同类型SQL操作的优先级及并发控制机制,将连接数始终控制在最佳连接数附近,使RDS数据库在高连接大并发情况下始终保持高性能。线程池的优势如下:

当大量线程并发工作时,线程池会自动调节并发的线程数量在合理的范围内,从而避免线程调度工作过多和大量缓存失效。
大量的事务并发执行时,线程池会将语句和事务分为不同的优先级,分别控制语句和事务的并发数量,从而减少资源竞争。
线程池给予管理类的SQL语句更高的优先级,保证这些语句优先执行。这样在系统负载很高时,新建连接、管理、监控等操作也能够稳定执行。
线程池给予复杂查询SQL语句相对较低的优先级,并且有最大并发数的限制。这样可以避免过多的复杂SQL语句将系统资源耗尽,导致整个数据库服务不可用。

三、安全性

TDE & SM4 & Data Protect

支持表级别国密SM4加密

Recycle Bin

Drop / Truncate 对象自动回收

回收站对象支持 restore 还原

回收站可灵活设置保留时常
主备间可设置不同的保留周期

Native Flashback

支持行级数据快速找回

  • 误操作删除数据

  • 不带 Where 条件的更新

  • 多语句忘记显式开启事务

  • 业务回档

XA Crash Safe

四、高性能

Fast Query Cache

查询缓存(Query Cache)是为了提高查询性能而实现的一种缓存策略,其基本思想是:对于每个符合条件的查询语句,直接对结果集进行缓存,当下次查询命中时,直接从缓存中取出对应的结果集返回,不需要经历SQL的分析、优化、执行等复杂过程,通过节约CPU资源来达到查询加速的目标,是一项非常实用的技术。

MySQL原生Query Cache在设计和实现上存在着较多严重问题:

并发处理较差,在多核情况下,可能并发越高性能降低越严重。
内存管理较差,内存利用率低并且回收不及时,造成内存浪费。
当缓存命中率较低时,性能无提升甚至会出现严重降低。
由于以上问题,MySQL原生Query Cache没有得到广泛应用,在最新版的MySQL 8.0中,取消此功能。阿里云数据库团队对Query Cache进行重新设计和全新实现,解决了以上几个主要问题:

  • 优化并发控制
    取消全局锁同步机制,采用无锁机制,重新设计并发场景下的同步问题,能够充分利用多核的处理能力,保证高并发场景下的性能。

  • 优化内存管理
    取消内存预分配机制,采用更加灵活的动态内存分配机制,及时回收无效的内存,保证内存的真实利用率。

  • 优化缓存机制
    动态检测缓存利用率,实时调整缓存策略,解决命中率偏低或读写混合等场景下的性能降低问题。

Binlog In Redo

由于每个事务提交会对磁盘进行两次I/O操作,虽然Binlog采用了Group Commit的方式合并I/O来提升效率,但两次I/O等待的本质没有改变,影响事务处理的效率,当使用云盘存储时,影响会更明显。I/O合并的效率是由同时提交的并发事务数量决定的,当并发量不够时I/O合并的效果也不理想,表现为少量的写操作事务提交时所需要的时间比较久,响应时间较长。

为了提高事务提交效率,AliSQL设计了Binlog in Redo机制,即在事务提交时将Binlog内容同步写入到Redo Log中。当事务提交时,只需要将Redo Log保存到磁盘中,从而减少一次对磁盘的操作,而Binlog文件则采用异步的方式,用单独的线程周期性的保存到磁盘中。在异常重启后,系统会用Redo Log中的Binlog内容来补齐Binlog文件。由于减少了一次I/O操作,性能得到了提升,响应时间变的更短,同时Binlog文件保存次数的减少,极大地降低了文件系统因文件长度实时变化带来的文件同步(fsync)压力,也提升了文件系统的性能。

Binlog in Redo功能不会改变Binlog的格式,基于Binlog的复制及第三方工具也不会受任何影响。

Statement Queue

MySQL的服务层和引擎层在语句并发执行过程中,有很多串行的点容易导致冲突。例如在DML语句中,事务锁冲突比较常见,InnoDB中事务锁的最细粒度是行级锁,如果语句针对相同行进行并发操作,会导致冲突比较严重,系统吞吐量会随着并发的增加而递减。AliSQL提供Statement Queue机制,能够减少冲突开销、有效提高实例性能。

AliSQL设计了针对语句的排队机制,将语句进行分桶排队,尽量把可能具有相同冲突的语句(例如操作相同行)放在一个桶内排队,减少冲突的开销。

Inventory Hint

在秒杀等业务场景中,减少库存是一个常见的需要高并发,同时也需要串行化的任务模型,AliSQL使用排队和事务性Hint来控制并发和快速提交/回滚事务,提高业务吞吐能力。

当前语句执行成功就提交事务上下文/当前语句执行失败就回滚事务上下文

以上是关于AliSQL特性的主要内容,如果未能解决你的问题,请参考以下文章

AliSQL特性

MySQL · 引擎特性 · InnoDB 事务系统

MySQL · 引擎特性 · InnoDB 事务系统

阿里云开启AliSQL邀测 开源版本 AliSQL 5.6.32

Ubuntu安装 Alisql编译安装步骤:

AliSQL-5.6.32编译安装