之前通过TIDB了解到了LSM Tree,优化了数据库的写入的速度,在mariadb下,也有一个基于LSM的存储引擎Myrocks,他也支持事务,目前也是稳定版本,最近有时间学习了下。目前10.7windows版本里面是自带myrocks的,只是默认没有起来,配置my.ini后,show engines就可以看到了。
为了测试真实的效果,我建了一个带主键和二级唯一索引的myrocks用户表,主键采用自增,二级索引是字符串类型,写入的字符串是36位uuid。用java程序拼好sql后,直接写入数据库。从写入笔记本电脑SSD磁盘的速度来看,每100条的写入时间是40ms左右,cup利用率很低,但是ssd硬盘的利用率达到了50%以上,读取的速度达到每秒20M,但是写入的速度也就不到1M,我想主要的磁盘时间都花在了判断写入的唯一索引字段是不是重复了。看来如果做用户表,要应付大量的用户同时注册,还是得分库,但是不用分表。如果是写入没有唯一索引判断的,就写入快得多了。Myrocks把所有的不同的表的数据都放在了一个文件夹下了,没有做明显的区分,应该是他觉得不需要按照表来划分LSM文件。我实际测试,写了将近3亿的数据,也没有觉得数据多了,读取和写入变慢了。
和myrocks插件并列还有许多的插件,有一个插件叫Spider ,配置后才可以生效。Spider 是 MariaDB 内置的一个可插拔用于 MariaDB/MySQL 数据库分片的存储引擎,充当应用服务器和远程后端 DB 之间的代理(中间件),它可以轻松实现 MariaDB/MySQL 的横向和纵向扩展,突破单台 MariaDB/MySQL 的限制,支持范围分区、列表分区、哈希分区,支持 XA 分布式事务,支持跨库 join。完成数据库跨越多组实例(instances)。
我测试了一下,在我本地的mariadb建一个spider表可以访问到我们的内网环境的mysql上的对应表。
通过带spider的mariadb将后面的所有的myrocks引擎通过XA事务连接在了一起,堪比tidb,由于只需要分库不用分表,减少了DBA大量的工作,设计系统的时候,只需要判断写入的速度,写入的容量能不能支持业务就可以了,读的优化是最容易的,我后面可以接N个从库来应对读请求。从系统的可维护性和可扩展性上来说,比tidb更好