MySQL Cluster写入效率测试
MySQL Cluster使用到目前为止遇到渴望得到答案的问题,也是直接影响使用的问题就是MySQL Cluster的写入效率问题和Cluster是否适合大数据存储、如何配置存储的问题。 在之前的测试中MySQL Cluster的写入效率一直不佳,这也是直接影响能否使用MySQL Cluster的
MySQL Cluster使用到目前为止遇到渴望得到答案的问题,也是直接影响使用的问题就是MySQL Cluster的写入效率问题和Cluster是否适合大数据存储、如何配置存储的问题。
在之前的测试中MySQL Cluster的写入效率一直不佳,这也是直接影响能否使用MySQL Cluster的关键。现在我们来仔细测试一下。使用的环境略有变化。
Data节点的内存扩展为4G。
集群配置如下:
[ndbd default] # Options affecting ndbd processes on all data nodes: NoOfReplicas=2 # Number of replicas DataMemory=2000M # How much memory to allocate for data storage IndexMemory=300M # How much memory to allocate for index storage # For DataMemory and IndexMemory, we have used the # default values. Since the "world" database takes up # only about 500KB, this should be more than enough for # this example Cluster setup. MaxNoOfConcurrentOperations=1200000 MaxNoOfLocalOperations=1320000
测试代码如下:
/** * 向数据库中插入数据 * * @param conn * @param totalRowCount * @param perRowCount * @param tableName * @author lihzh(OneCoder) * @throws SQLException * @date 2013 -1 -17 下午1:57:10 */ private void insertDataToTable(Connection conn, String tableName, long totalRowCount, long perRowCount, long startIndex) throws SQLException { conn.setAutoCommit( false); String sql = "insert into " + tableName + " VALUES(?,?,?)"; System. out.println( "Begin to prepare statement."); PreparedStatement statement = conn.prepareStatement(sql); long sum = 0L; for ( int j = 0; j <p> 分下列情景进行写入测试。</p> <p> 数据加载、写入在内存中时,在独立的新库、新表中一次写入100,1000,10000,50000条记录,分别记录其耗时情况。(5次平均)</p> <pre class="brush:php;toolbar:false"> 100:260ms 1000:1940ms 10000:17683ms(12000-17000) 50000: 93308、94730、90162、94849、162848
与普通单点MySQL写入效率进行对比(2G内存)
100:182ms 1000:1624ms 10000:14946ms 50000:84438ms
双线程并发写入测试
由于只有两个SQL节点,所以这里只采用双线程写入的方法进行测试。代码上采用了简单的硬编码
/** * 多线程并行写入测试 * * @author lihzh(OneCoder) * @blog http://www.coderli.com * @date 2013 -2 -27 下午3:39:56 */ private void parallelInsert() { final long start = System. currentTimeMillis(); Thread t1 = new Thread( new Runnable() { @Override public void run() { try { Connection conn = getConnection(DB_IPADDRESS, DB_PORT, DB_NAME, DB_USER, DB_PASSOWRD); MySQLClusterDataMachine dataMachine = new MySQLClusterDataMachine(); dataMachine.insertDataToTable(conn, TABLE_NAME_DATAHOUSE, 500, 100, 0); long end1 = System.currentTimeMillis(); System. out.println( "Thread 1 cost: " + (end1 - start)); } catch (SQLException e) { e.printStackTrace(); } } }); Thread t2 = new Thread( new Runnable() { @Override public void run() { try { Connection conn = getConnection(DB_IPADDRESS_TWO, DB_PORT, DB_NAME, DB_USER, DB_PASSOWRD); MySQLClusterDataMachine dataMachine = new MySQLClusterDataMachine(); dataMachine.insertDataToTable(conn, TABLE_NAME_DATAHOUSE, 500, 100, 500); long end2 = System.currentTimeMillis(); System. out.println( "Thread 2 cost: " + (end2 - start)); } catch (SQLException e) { e.printStackTrace(); } } }); t1.start(); t2.start(); }
测试结果:
(总条数/每次) | 线程1(总/平均- 各写一半数据) | 线程2 | 并行总耗时 | 单线程单点 |
1000/100 | 985/197 | 1005/201 | 1005/201 | 2264/226 |
10000/1000 | 9223/1836 | 9297/1850 | 9297/1850 | 19405/1940 |
100000/10000 | 121425/12136 | 122081/12201 | 121425/12136 |
148518/14851 |
从结果可以看出,在10000条以下批量写入的情况下,SQL节点的处理能力是集群的瓶颈,双线程双SQL写入相较单线程单节点效率可提升一倍。但是当批量写入数据达到一定数量级,这种效率的提升就不那么明显了,应该是集群中的其他位置也产生了瓶颈。
注:由于各自测试环境的差异,测试数据仅可做内部比较,不可外部横向对比。仅供参考。
写入测试,要做的还很多,不过暂时告一段落。大数据存储和查询测试,随后进行。
原文地址:MySQL Cluster写入效率测试, 感谢原作者分享。

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

MySQL启动失败的原因有多种,可以通过检查错误日志进行诊断。常见原因包括端口冲突(检查端口占用情况并修改配置)、权限问题(检查服务运行用户权限)、配置文件错误(检查参数设置)、数据目录损坏(恢复数据或重建表空间)、InnoDB表空间问题(检查ibdata1文件)、插件加载失败(检查错误日志)。解决问题时应根据错误日志进行分析,找到问题的根源,并养成定期备份数据的习惯,以预防和解决问题。

MySQL 可在无需网络连接的情况下运行,进行基本的数据存储和管理。但是,对于与其他系统交互、远程访问或使用高级功能(如复制和集群)的情况,则需要网络连接。此外,安全措施(如防火墙)、性能优化(选择合适的网络连接)和数据备份对于连接到互联网的 MySQL 数据库至关重要。

MySQL使用共享锁和排他锁管理并发,提供表锁、行锁和页锁三种锁类型。行锁可提高并发性,使用FOR UPDATE语句可给行加排他锁。悲观锁假设冲突,乐观锁通过版本号判断数据修改。常见锁表问题表现为查询缓慢,使用SHOW PROCESSLIST命令查看锁持有的查询。优化措施包括选择合适索引、减少事务范围、批量操作和优化SQL语句。

MySQL数据库操作中,字符串处理是不可避免的环节。SUBSTRING_INDEX函数正是为此而设计的,它能高效地根据分隔符提取子字符串。SUBSTRING_INDEX函数应用示例以下示例展示了SUBSTRING_INDEX函数的灵活性和实用性:从URL中提取特定部分例如,提取域名:SELECTSUBSTRING_INDEX('www.mysql.com','.',2);提取文件扩展名轻松获取文件扩展名:SELECTSUBSTRING_INDEX('file.pdf','.',-1);处理不存在

MySQL 主键不可以为空,因为主键是唯一标识数据库中每一行的关键属性,如果主键可以为空,则无法唯一标识记录,将会导致数据混乱。使用自增整型列或 UUID 作为主键时,应考虑效率和空间占用等因素,选择合适的方案。

MySQL 可返回 JSON 数据。JSON_EXTRACT 函数可提取字段值。对于复杂查询,可考虑使用 WHERE 子句过滤 JSON 数据,但需注意其性能影响。MySQL 对 JSON 的支持在不断增强,建议关注最新版本及功能。

对于生产环境,通常需要一台服务器来运行 MySQL,原因包括性能、可靠性、安全性和可扩展性。服务器通常拥有更强大的硬件、冗余配置和更严格的安全措施。对于小型、低负载应用,可在本地机器运行 MySQL,但需谨慎考虑资源消耗、安全风险和维护成本。如需更高的可靠性和安全性,应将 MySQL 部署到云服务器或其他服务器上。选择合适的服务器配置需要根据应用负载和数据量进行评估。

MySQL 和 MariaDB 可以共存,但需要谨慎配置。关键在于为每个数据库分配不同的端口号和数据目录,并调整内存分配和缓存大小等参数。连接池、应用程序配置和版本差异也需要考虑,需要仔细测试和规划以避免陷阱。在资源有限的情况下,同时运行两个数据库可能会导致性能问题。
