数据库选型之MySQL(二)

刘勇    Email: [email protected]

本博客记录作者在工作与研究中所经历的点滴,一方面给自己的工作与生活留下印记,另一方面若是能对大家有所帮助,则幸甚至哉矣!

简介

鉴于高频中心库task(核心业务处理与存储逻辑)部分占用机器较多,为节省成本,调研数据库或缓存,以期满足高频生产的需求:1)峰值1w条/s;2)峰值60w条/m。本着节省成本的角度,本文对开源、免费的数据库MySQL在固态硬盘下从事务处理条目下展开测试,测试目标平均写入速率达10000条/s 以上则能满足要求。

测试环境

硬件环境

10.1.120.34:Intel Core I5-4590, 主频:3.30G,  内存:16G, 有固态硬盘

软件环境:

10.1.120.34: Cent OS 6.5,  MySQL 5.6.26 (社区版)

表结构:

 1 DROP TABLE IF EXISTS `transaction`;
 2 CREATE TABLE `transaction` (
 3   `tradedate` datetime DEFAULT NOT NULL,
 4   `symbol` varchar(6) DEFAULT NOT NULL,
 5   `symbolname` varchar(8) DEFAULT NOT NULL,
 6   `trdmintime` varchar(6) DEFAULT NOT NULL,
 7   `startprice` decimal(9,3) DEFAULT NOT NULL,
 8   `highprice` decimal(9,3) DEFAULT NOT NULL,
 9   `lowprice` decimal(9,3) DEFAULT NOT NULL,
10   `endprice` decimal(9,3) DEFAULT NOT NULL,
11   `change` decimal(9,3) DEFAULT NOT NULL,
12   `changeratio` decimal(6,3) DEFAULT NOT NULL,
13   `minvolume` decimal(10,0) DEFAULT NOT NULL,
14   `minamout` decimal(16,3) DEFAULT NOT NULL,
15   `unix` bigint(20) DEFAULT NOT NULL,
16   `market` varchar(3) DEFAULT NOT NULL
17 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

配置文件:即数据库配置文件,见/etc/my.cnf

 1 # read_rnd_buffer_size = 2M
 2 datadir=/var/lib/mysql
 3 socket=/var/lib/mysql/mysql.sock
 4 innodb_flush_log_at_trx_commit = 2
 5 innodb_autoinc_lock_mode = 2
 6 query_cache_type = 1
 7 query_cache_size = 20M
 8 innodb_buffer_pool_size = 2G
 9 innodb_flush_method = O_DSYNC
10 # Disabling symbolic-links is recommended to prevent assorted security risks
11 symbolic-links=0

性能测试

事务处理

针对高频生产的应用需求,本文构造高频中心库系统的数据结构,从事物处理角度,对本地节点MySQL进行写入操作,分别存储数据量为60K、100K、600K条数据,对其速率进行测试。需要指出,由于常见I/O访问的瓶颈主要受限于写入测试,本文只针对写入操作进行测试,暂不考虑读取操作或者混合读写方式,若写入操作不满足要求,其它操作无需测试。

本文采用写入多条数据执行事务处理。因为10.1.120.34上采用固态硬盘作为存储介质,其安装有MySQL,根据应用场景,第一种从远程访问,即测试主机10.1.25.50访问MySQL,第二种从本地访问10.1.120.34访问MySQL。以下分别从事务处理条目为1000、2000和3000下展开测试。

以1000条数据为基础执行事务处理,结果见表-1。

表-1  1000条下事务处理MySQL测试结果


节点


数据库IP


数据量(K)

平均写入速率(条/s)
远程节点 10.1.120.34 60 2328
远程节点 10.1.120.34 100 2366
远程节点 10.1.120.34 600 2372
本地节点 10.1.120.34 60 14936
本地节点 10.1.120.34 100 16526
本地节点 10.1.120.34 600 21169

以2000条数据为基础执行事务处理,结果见表-2。

表-2  2000条下事务处理MySQL测试结果


节点


数据库IP


数据量(K)

平均写入速率(条/s)
远程节点 10.1.120.34 60 2318
远程节点 10.1.120.34 100 2333
远程节点 10.1.120.34 600 2320
本地节点 10.1.120.34 60 12714
本地节点 10.1.120.34 100 17914
本地节点 10.1.120.34 600 20214

以3000条数据为基础执行事务处理,结果见表-3。

表-3  3000条下事务处理MySQL测试结果


节点


数据库IP


数据量(K)

平均写入速率(条/s)
远程节点 10.1.120.34 60 2319
远程节点 10.1.120.34 100 2377
远程节点 10.1.120.34 600 2429
本地节点 10.1.120.34 60 11202
本地节点 10.1.120.34 100 17587
本地节点 10.1.120.34 600 18577

小结

从表1-3可知:1)在远程节点访问MySQL,即使采用固态硬盘,其速率还是较慢,无法满足需求;2)在本地节点,访问MySQL,则能够满足高频生产的需求。

批处理

为比较批处理方式和事务处理方式的性能,本文针对其进行比较测试。

每1000条数据,执行一次批处理,测试结果如表-4。

表-4  1000条下批处理与事务处理MySQL测试结果


方式


数据库IP


数据量(K)

平均写入速率(条/s)
批处理 10.1.120.34 60 15974
批处理 10.1.120.34 100 16328
批处理 10.1.120.34 600 17633
事务处理 10.1.120.34 60 14936
事务处理 10.1.120.34 100 16526
事务处理 10.1.120.34 600 21169

每2000条数据,执行一次批处理,测试结果如表-5。

表-5  2000条下批处理与事务处理MySQL测试结果


方式


数据库IP


数据量(K)

平均写入速率(条/s)
批处理 10.1.120.34 60 14840
批处理 10.1.120.34 100 16310
批处理 10.1.120.34 600 17364
事务处理 10.1.120.34 60 12714
事务处理 10.1.120.34 100 17914
事务处理 10.1.120.34 600 20214
每3000条数据,执行一次批处理,测试结果如表-6。

表-6  3000条下批处理与事务处理MySQL测试结果


节点


数据库IP


数据量(K)

平均写入速率(条/s)
批处理 10.1.120.34 60 14641
批处理 10.1.120.34 100 16371
批处理 10.1.120.34 600 17593
事务处理 10.1.120.34 60 11202
事务处理 10.1.120.34 100 17587
事务处理 10.1.120.34 600 18577

         小结

从表4-6测试结果来看,在写入数据量少时,批处理方式较事务方式速率快一些,但是随着访问数据量增加,事务处理方式稍微快一些。

总结

从上述测试结果来看,以固态硬盘作为存储介质,在本地访问MySQL可以满足高频生产的需求。此外,鉴于高频生产高负载的需求,优先选择事务处理方式。

附录

测试部分源代码:

 1 public void initMySQL()
 2     {
 3         String driver = "com.mysql.jdbc.Driver";
 4         String url = "jdbc:mysql://10.1.120.34:3306/hdfs";
 5         String user = "root";
 6         String password = "";
 7
 8         try {
 9             Class.forName(driver);
10             conn = DriverManager.getConnection(url, user, password);
11             if (!conn.isClosed())
12                 System.out.println("Start MySQL!");
13         } catch (Exception e) {
14             e.printStackTrace();
15         }
16
17         count = 0;
18         sql = "insert into transaction" + " values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
19         try {
20             pstm = conn.prepareStatement(sql);
21             conn.setAutoCommit(false);
22         } catch (SQLException e) {
23             e.printStackTrace();
24         }
25     }

 1 public void insertData(Transaction ts)
 2     {
 3         try {
 4             pstm.setDate(1, ts.getTradedate());
 5             pstm.setString(2,  ts.getSymbol());
 6             pstm.setString(3, ts.getSymbolName());
 7             pstm.setString(4, ts.getTrdmintime());
 8             pstm.setBigDecimal(5, ts.getStartprice());
 9             pstm.setBigDecimal(6, ts.getHighprice());
10             pstm.setBigDecimal(7, ts.getLowprice());
11             pstm.setBigDecimal(8, ts.getEndprice());
12             pstm.setBigDecimal(9, ts.getChange());
13             pstm.setBigDecimal(10, ts.getChangeratio());
14             pstm.setBigDecimal(11, ts.getMinvolume());
15             pstm.setBigDecimal(12, ts.getMinamout());
16             pstm.setLong(13, ts.getUnix());
17             pstm.setString(14, ts.getMarket());
18
19             pstm.executeUpdate();
20             count++ ;
21             if (count == Test.PREFIX) {
22                 conn.commit();
23                 conn.setAutoCommit(false);
24                 count = 0;
25             }
26
27         } catch (SQLException e) {
28             try {
29                 conn.rollback();
30             } catch (SQLException e1) {
31                 e1.printStackTrace();
32             }
33             e.printStackTrace();
34         }
35     }

时间: 2024-08-07 12:30:05

数据库选型之MySQL(二)的相关文章

数据库选型之MySQL(三)

刘勇    Email: [email protected] 本博客记录作者在工作与研究中所经历的点滴,一方面给自己的工作与生活留下印记,另一方面若是能对大家有所帮助,则幸甚至哉矣! 简介 鉴于高频中心库task部分占用机器较多,为节省成本,调研数据库或缓存.在数据库选型之MySQL(二)中,在固态硬盘本地访问MySQL可以满足其10000次/s操作的需求,由于实际环境中存在多个品种(多进程.多线程访问数据库)的业务需求,因此,本文采用多线程在固态硬盘本地访问MySQL展开测试,以期对高频中心库

数据库选型之MySQL(一)

刘勇   Email:[email protected] 本博客记录作者在工作与研究中所经历的点滴,一方面给自己的工作与生活留下印记,另一方面若是能对大家有所帮助,则幸甚至哉矣! 简介 鉴于高频中心库task部分(核心业务处理.存储逻辑)占用机器较多,为节省成本,调研数据库或缓存,以期满足高频生产的需求:1)峰值1w条/s:2)峰值60w条/m.本着节省成本的角度,本文对开源.免费的数据库MySQL和PostgreSQL从单一处理和批处理角度展开测试,测试目标平均写入速率达10000条/s 以上

数据库选型之亿级数据量并发访问(MySQL集群)

刘 勇  Email:[email protected] 简介 针对实际应用中并发访问MySQL的场景,本文采用多线程对MySQL进行并发读取访问,其中以返回用户所需的数据并显示在终端为测试结束节点,即将数据从MySQL集群读取后存储于客户端本地内存中.测试过程如下:分别针对4种应用场景,从10.20.50.100个线程对MySQL展开测试.测试结果表明:对场景1)一般的并发访问能够满足需求:对于场景2)和3)响应时间在分钟级,分别处于1-3分钟和10分钟左右:对于场景4)则经常会抛出异常,并且

MySql数据库学习笔记(二)—MySQL使用

1.基本命令 1. 连接数据库 mysql –u用户名 –p密码 –h主机IP 2. 创建数据库 mysql> create database 数据库名 3. 创建表 mysql> create table 表名(列名 类型 primary key(定义主键) auto_increment ) 4. 查看所有数据库 mysql> show databases; 5. 选择数据库 mysql> use 数据库名; 6. 查看数据库所有的表 mysql> show tables;

MySQL数据库基础知识(二)

21.查询数据 格式:   select [字段列表]|* from 表名   [where 搜索条件]   [group by 分组字段 [having 子条件]]   [order by 排序 asc|desc]   [limit 分页参数] mysql>select * from stu; +----+----------+-----+-----+---------+ | id | name | age | sex | classid | +----+----------+-----+--

数据库选型

我觉得首先来看一看今天企业里面经常谈的一个问题就是整合的问题.为什么会谈到整合的问题,因为整合就是你现在有很多没有被整合的东西,所以是信息孤岛,因为有信息孤岛的存在,所以需要整合.反过来讲为什么信息孤岛会存在,谁都没有希望在建系统的时候要把它做成一个孤岛.原因在于很多时候CIO在选择建一个整个企业的系统的时候,它是希望由应用来驱动.也就是说他在不断建一个一个应用,比如说我要建一个ERP的应用,比如说我需要建一个人事的应用,等等有各种各样的应用,有风险的应用.这样你会发现每一个应用他都建立起来了,

分布式数据库选型——数据水平拆分方案

概述 水平拆分的概念随着分布式数据库的推广已为大部分人熟知.分库分表.异构索引.小表广播.这些功能几乎是产品功能需求标配.然而有些客户使用分布式数据库后的体验不尽如意.本文尝试从数据的角度总结分布式数据的复制(replication)和分区(partition)技术原理和方案,其中分区也有称为分片(sharding),希望能引起读者一些思考,在分布式数据库选型中能注意这些细节的区别,选择适合业务的数据水平拆分方案. 分布式数据库架构 分布式数据库以集群形式存在,有多个节点.集群架构有共享磁盘架构

微服务架构案例(03):数据库选型简介,业务数据规划设计

本文源码:GitHub·点这里 || GitEE·点这里 更新进度(共6节): 01:项目技术选型简介,架构图解说明 02:业务架构设计,系统分层管理 03:数据库选型,业务数据设计规划 一.数据库选择 1.数据库分类 数据库类型 常见数据库 关系型 MySQL.Oracle.DB2.SQLServer等. 非关系型 Hbase.Redis.MongodDB等. 行式存储 MySQL.Oracle.DB2.SQLServer等. 列式存储 Hbase.ClickHouse等. 分布式存储 Cas

MySQL、SqlServer、Oracle三大主流数据库分页查询 (MySQL分页不能用top,因为不支持)

一. MySQL 数据库 分页查询MySQL数据库实现分页比较简单,提供了 LIMIT函数.一般只需要直接写到sql语句后面就行了.LIMIT子 句可以用来限制由SELECT语句返回过来的数据数量,它有一个或两个参数,如果给出两个参数, 第一个参数指定返回的第一行在所有数据中的位置,从0开始(注意不是1),第二个参数指定最多返回行数.例如:select * from table WHERE … LIMIT 10; #返回前10行select * from table WHERE … LIMIT