回顾 MySQL / InnoDB 的改善历史。你能很容易发现。在MySQL 5.6稳定版本中从来没有在read-only 这么快的提速,它很容易搞懂,以及在read-only(RO)有着良好的扩张性。也很期待它在read+write(RW)上达到一个较高水平。(特别是在读取数据是数据库主要工作的时候) 然而。我们对于RO在 MySQL 5.6的表现也十分的高兴,在5.7这个版本中,主要工作集中在 read+write (RW)上, 因为在大数据的处理上还没能达到我们的期望。但是RW依赖RO下。能够再次提高速度。 InnoDB 团队通过不断的改进,强烈的推进优化着5.7这个版本的每秒的性能。 下面就按顺序为大家讲解 |
你要爪子
|
事实上,在MySQL中只读工作量控制内部链接的方式有以下两种:
任何很快的单表范围测试的工作量主要由于MDL链接导致锁住。而多表将会由于InnoDB内部构件限制(不同的表将由不同的MDL锁保护,所以这种情况下MDL中的链接瓶颈将会降低)。但是同样,也要看工作量的大小--一个比一般多的只读工作测量将会在MySQL5.6中表现的会更好(如Sysbench OLTP_RO),同时在工作量少而快的查询(如Sysbench Point-Selects(用外键去取一个记录))将会使所有链接变得困难,而且只能在16核-HT中测量,而在32核中表现很差..但是任何如Point-Select测试的工作量将在所有MySQL内部构件一起工作是会让你看到可能达到最大的性能(开始用SQL解析器,终止与取行值)..在你给定的MySQL版本和给定的HW配置下,这也可能达到最大SQL 查询/每秒(QPS)率。 |
yale8848
|
在Mysql5.6上我们获得的最佳结果是25万个查询每秒,这也是那段时间Mysql/InnoDb上使用SQL语句查询得到的最好的结果了。 当然,只有在使用‘只读事务’功能才能达到这么高速度(Mysql5.6上的新功能);另外,需要使用AUTOCOMMIT=1,否则CPU就会被轻易地浪费在启动事务、提交事务上,你会实际上损失系统的整体性能。 因此,在Mysql5.7上介绍的第一个改进是‘只读事务的自动发现’(实际上每个InnoDb事务都被认为是只读的直到有一个DML声明在此之外)功能---,这很大程度上简化了只读事务功能,节省了用户和开发者的时间,他们不用再去管理是否采用只读事务功能。但是,使用这个功能你仍然不能达到Mysql潜在的最佳每秒查询率,因为CPU时间还是浪费在事务的开启、结束状态处理过程当中。 |
王瑞平
|
同时,Percona用不同的的方案来解决“事务列表”管理(TRX-列表)及在InnoDB中trx_sys互斥链接慢的问题。Percona的解决方案在用事务处理Point-Selects高负载时能表现良好,但MySQL5.7表现一般(但我不会公布5.7的结果,因为它的代码不公开)...所以,至少我现在可以做一些比较: 观察结果:
|
yale8848
|
然而,很明显,如果用MySQL想要得到最大的潜在每秒查询速率,事务应当避免。 让我们来看一看这是2013年5月我们的每秒最大查询速率。 在同一点八张表进行测试,但是没有使用MySQL5.6的事物: 观察:
|
NCThinker
|
而在MySQL5.7上做同样的测试却看起来大有不同,因为在5.7中lock_sys互斥链接的时间段已经很低了,同时trx_sys互斥相关代码也得到第一次变化的情形: 观察结果:
|
yale8848
|
从另一方面来讲,仍然有改进的空间这点还是很清晰的。有关trx_sys的争用仍然在持续。我们没有充分的使用CPU的能力来做有用的工作(仍然有许多CPU周期用在锁的轮转)...不过现在的结果比以前好多了,并且比5.6好很多,因此没有理由继续挖掘来提高这方面的性能,我们主要集中在我们曾经花费了巨大的空间的读写负载的性能提高上。 到了5月底,也就是我们的性能会议期间,Sunny给try_sys互斥争用增加了几个新的更改,从那以后最大的每秒可进行的查询(QPS)可达到375K!这是不是对5.7进行了足够的性能提高,对吗?;-) 同时,我们继续与建议用其他方式管理TRX列表的Percona团队交换了意见,他们的方案看起来非常有趣,不过在5.5上,这样的代码却不能展示出更高的每秒可进行的查询数(QPS),而且在5.6上的这样代码(曾经测试过Percona Server 5.6)最大的每秒可进行的查询数(QPS)也不会比在MySQL 5.6上大。然而,讨论涉及到一个有趣的观点:如果同时有一些读写负载在运行的话,它对只读性能有什么影响呢?...而且,即使在同样的测试条件下MySQL 5.7代码仍然运行的要好一些,效果是非常明显的(你可以在这儿查看我的分析,然而,再次说明一下,这段时间内我不能展示5.7上的结果,因为它的代码还没有对大众公布-也许会在以后的一篇文章中给出).. |
几点人
|
由于这儿同时对任何纯粹的读写负载也有影响,因此有足够的动机以Sunnys很长时间所期待的那样重新写整个TRX列表相关的代码,然而,这种经历简直让人痴迷!
;-)) 日复一日,我们很高兴的看到我们的每秒可进行的查询图逐渐变高,直到在同一个32核的超线程服务器上达到了每秒可进行的查询440K! 5.7开发里程碑发布2上进行的Select 8个表所得到的结果数: 不需要说明..;-)) 然而,有一个小小的令人奇怪的地方-我们试图与Sunny通过不同的工具分析所有瓶颈和代码更改所带来的影响。而且在某些测试里,令我吃惊的是Sunny观察到比我更高的每秒可进行的查询数..这个“奇异之处”与下面因素相关:
|
几点人
|
让我们来比较“之前”和“之后”的差异 观察结果:
还有什么呢? 我可能只提到:kudos Sunny和整个MySQL的开发团队; 让我们看一下现在选择8张表工作负载的情况下的最大每秒查询。
每个引擎都在以下配置下进行测试:
|
NCThinker
|
最好的结果是来自任意两个特定的组合间的比较。通过对数据库引擎的比较,我得到了下面的一个图表,这个图表我在以前的文章中已经提到过了。 下面是一些评论:
具有什么样的扩展性呢? 答案是简单的:MySQL5.7是唯一在此基础上进行扩展的。 如果使用ip端口和一个重量级的Sysbench-0.4.13,会得到如下的结果: QPS只是稍微的略低一点,但是总体的趋势是完全一样的。 可扩展性也是非常的相似:
更多的结果将会出来,敬请期待; 注意:对一个单表绑定过多的工作负载是不好的:
|
NCThinker
|
还有很多挑战摆在我们面前;-) 作为参考,我上述测试的硬件配置信息如下:
my.conf: max_connections=4000 key_buffer_size=200M low_priority_updates=1 table_open_cache = 8000 back_log=1500 query_cache_type=0 table_open_cache_instances=16 # files innodb_file_per_table innodb_log_file_size=1024M innodb_log_files_in_group = 3 innodb_open_files=4000 # buffers innodb_buffer_pool_size=32000M innodb_buffer_pool_instances=32 innodb_additional_mem_pool_size=20M innodb_log_buffer_size=64M join_buffer_size=32K sort_buffer_size=32K # innodb innodb_checksums=0 innodb_doublewrite=0 innodb_support_xa=0 innodb_thread_concurrency=0 innodb_flush_log_at_trx_commit=2 innodb_max_dirty_pages_pct=50 innodb_use_native_aio=1 innodb_stats_persistent = 1 innodb_spin_wait_delay= 6 / 96 # perf special innodb_adaptive_flushing = 1 innodb_flush_neighbors = 0 innodb_read_io_threads = 4 innodb_write_io_threads = 4 innodb_io_capacity = 4000 innodb_purge_threads=1 innodb_adaptive_hash_index=0 # monitoring innodb_monitor_enable = '%' performance_schema=OFF 如果你需要的话,Linux Sysbench的二进制版本在这里:
使用UNIX socket来运行Point-Selects测试的Sysbench命令如下(在parallel中启动8个进程): LD_PRELOAD=/usr/lib64/libjemalloc.so /BMK/sysbench-0.4.8 --num-threads=$1 --test=oltp --oltp-table-size=10000000 \ --oltp-dist-type=uniform --oltp-table-name=sbtest_10M_$n \ --max-requests=0 --max-time=$2 --mysql-socket=/SSD_raid0/mysql.sock \ --mysql-user=dim --mysql-password=dim --mysql-db=sysbench \ --mysql-table-engine=INNODB --db-driver=mysql \ --oltp-point-selects=1 --oltp-simple-ranges=0 --oltp-sum-ranges=0 \ --oltp-order-ranges=0 --oltp-distinct-ranges=0 --oltp-skip-trx=on \ --oltp-read-only=on run > /tmp/test_$n.log & 使用IP端口来运行Point-Selects测试的Sysbench命令如下(在parallel中启动8个进程): LD_PRELOAD=/usr/lib64/libjemalloc.so /BMK/sysbench-0.4.13 --num-threads=$1 --test=oltp --oltp-table-size=10000000 \ --oltp-dist-type=uniform --oltp-table-name=sbtest_10M_$n \ --max-requests=0 --max-time=$2 --mysql-host=127.0.0.1 --mysql-port=5700 \ --mysql-user=dim --mysql-password=dim --mysql-db=sysbench \ --mysql-table-engine=INNODB --db-driver=mysql \ --oltp-point-selects=1 --oltp-simple-ranges=0 --oltp-sum-ranges=0 \ --oltp-order-ranges=0 --oltp-distinct-ranges=0 --oltp-skip-trx=on \ --oltp-read-only=on run > /tmp/test_$n.log & 愿你有所收获, -Dimitri |
相关推荐
根据官方基准测试,在特定配置下,MySQL 5.7 的 Point Select 操作可以支持高达 1600000 次每秒的查询量,相较于 MySQL 5.6 版本有显著提升。 - **硬件配置**:测试环境采用了 Intel(R) Xeon(R) CPU E7-8890 v3 (4 ...
- `vrrp_script vs_mysql_82`: 定义了一个检查MySQL状态的脚本,每30秒执行一次。 - `vrrp_instance VI_82`: 定义了VRRP实例VI_82的相关参数,包括状态、接口、虚拟IP等。 - `authentication`: 定义了认证方式为...
你可以通过监控性能指标,如QPS(每秒查询量)、RT(响应时间)等,来调整相关参数以提高性能。 7. **备份与恢复**:定期备份数据库非常重要,MySQL支持全量备份(mysqldump)和增量备份(Binary Log)。了解如何...
- MySQL 8.0.20的TPS(每秒事务处理量)和QPS(每秒查询处理量)均高于MySQL 5.7.30,尤其是在高并发情况下表现更为明显。 - **只读模式(OLTP_READ_ONLY)**: - MySQL 8.0.20同样在TPS和QPS方面表现出优于MySQL ...
《MySQL实现雪花算法详解》 在当今的互联网环境中,分布式系统和微服务架构越来越常见,随之而来的是数据库的拆分与分表需求。在这种背景下,如何生成全局唯一且不重复的ID成为了一个重要的问题。本文将详细介绍...
### MySQL 5.5 服务器变量详解 #### autocommit={0|1} - **定义**: 控制MySQL事务是否在每次执行数据修改语句后自动提交。...了解这些变量的含义和作用可以帮助数据库管理员更好地管理和优化MySQL服务器性能。
更好的性能:对于多核CPU、固态硬盘、锁有着更好的优化,每秒100W QPS已不再是MySQL的追求,下个版本能否上200W QPS才是吾等用户更关心的; 更好的InnoDB存储引擎:内容太多,就等Inside君的《MySQL技术内幕:InnoDB...
为了解决这个问题,MySQL 5.7引入了一个新的ack collector thread,这个线程专门负责接收从库的ACK,使得master可以同时发送binlog事件和接收ACK,从而实现了发送和接收的异步化,极大地提高了TPS(每秒事务处理量)...
在相同测试条件下,其每秒查询数(QPS)达到180万的高峰。 再进一步,文档介绍了MySQL 8.0在OLTP只读和读写工作负载下相较于MySQL 5.7和MySQL 5.6的性能提升。根据文档内容,MySQL 8.0在TPS基准测试中比MySQL 5.7快...
### MySQL 5.7 数据类型概述 MySQL 5.7 提供了丰富的数据类型支持,这些类型被划分为几个大类:数值类型、日期时间类型、字符串类型(字符和字节类型)、空间类型以及 JSON 类型。本篇将对这些数据类型进行详细解读...
9. **性能优化**:监控MySQL的性能指标,如QPS(每秒查询数)、TPS(每秒事务数)、CPU和内存使用情况等。根据需求调整`my.cnf`中的参数,如`innodb_buffer_pool_size`、`thread_cache_size`等。 10. **故障排查**...
MySQL 中造 3000 条数据的三个方法 MySQL 是一种非常流行的关系型数据库管理系统,它提供了多种方式来快速生成大量数据。本文将介绍三种方法来在 MySQL 中造 3000 条数据。 方法一:使用存储过程 存储过程是一种...
1. **自动分析**:通过对MySQL服务器的监控,收集如QPS(每秒查询数)、TPS(每秒事务处理数)以及慢查询日志等信息,自动分析出当前系统的需求和瓶颈。 2. **推荐配置**:根据分析结果,结合数据库的工作负载,...
Sysbench性能基准测试显示,MySQL在读写和只读测试中均比5.7版本快两倍,而且达到了每秒180万查询的新记录。这些改进使得MySQL 8.0能够更好地适应高并发的数据访问需求,特别适合于云和SaaS/PaaS/DBaaS平台上的应用...
QPS:Queries Per Second 查询量/秒,是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理查询量多少的衡量标准。 TPS : Transactions Per Second 是事务数/秒,是一台数据库...
- **避免使用**:除非确实需要所有列的信息,否则应避免使用`SELECT *`,以减少不必要的数据传输和提高查询性能。 ##### 5.5 字段上添加函数使用规范 - **限制使用**:在查询中尽量避免对字段使用函数,因为这可能...
2. **查询缓存**:MySQL在5.7版本之前提供了查询缓存功能,但自8.0版本起已被移除。缓存用于存储已经执行过的SQL语句及其结果,如果相同的查询再次被提交,可以直接从缓存中获取结果,避免了解析和执行的开销。然而...
这里我们不一一介绍,如果你发现 redo log 推进的非常快,为了避免用户线程陷入刷脏,可以通过调大 innodb_io_capacity_max 来解决,该参数限制了每秒刷新的脏页上限,调 大该值可以增加 Page cleaner 线程每秒的...