高性能的MySQL(8)优化服务器配置一并发和负载

简介:

当MySQL遇到高并发时,可能会遇到不曾遇到的瓶颈。


一、InnoDB并发配置


InnoDB是为高性能设计的,在最近几年他的提升非常明显,但依然不完美。

InnoDB有自己的 “线程调度器”控制线程怎么进入内核访问数据,以及他们在内核中一次可以做哪些事情。最基本的限制并发的方式是使用innodb_thread_concurrency变量,它会限制一次性可以有多少个线程进入内核,0表示不限制。

理论上,下面的公式可以给出一个这样的值

并发值 = CPU数量 * 磁盘数量 * 2

但是在实践中,使用更小的值会更好一点,必须做实验来找出合适系统的最好值。

如果已经进入内核的线程超过了允许的数量,新的线程就无法进入内核。

InnoDB使用两段处理来尝试让线程尽可能高校的进入内核。两段策略减少了减少了因为操作系统调度引起的切换。线程第一次休眠innodb_thread_sleep_delay微妙,然后再重试进入内核,如果依然不能进入内核,则放入一个等待线程队列,让操作系统来处理。

第一阶段的默认休眠时间是10000微秒,当CPU有大量的线程处在“进入队列前的休眠”状态,因而没有被充分利用时,改变这个值在高并发环境里可能会有帮助,特别是有大量小查询时。

一旦线程进入内核,他会有一定数量的“票据(tickets)”,可以让它“免费”返回内核,不需要再做并发检查。innodb_concurrency_tickets选项控制票据的数量,很少需要改动,除非有很多运行时间极长的查询。

还有另一个提交阶段的并发瓶颈,这个时候I/O非常密集,因为需要做刷新操作。innodb_commit_concurrency变量控制有多少个线程可以在同一时间提交,如果线程冲突比较多,可以修改这个值。

有一个新的方法是使用线程池来限制并发,MariaDB已经实现了,并且Oracle一个商业插件可以为MySQL5.5提供线程池功能。


二、MyISAM并发配置


某些条件下MyISAM也允许并发插入和读取,但是首先要理解MyISAM是怎样删除和插入行的。

MyISAM的删除操作不会重新整理整个表,它们只是把行标记为删除,在表中留下“空洞”。MyISAM在插入时重新利用填满这些空洞,如果没有空洞,就把新行插到表的末尾。

尽管MyISAM是表级锁,它依然可以一边读取,一边并发追加新行,这中情况只能读取到查询开始时的所有数据,新插入的数据是不可见的,这样避免不一致读。

然而,若表中间的某些数据变动了的话,还是难以提供一致读。MVCC解决了这个问题,通过版本号来校验,但是MyISAM并不支持,所以除非插入操作在表的结尾,否则不能支持并发插入。

通过设置concurrent_insert这个变量,可以配置MyISAM打开并发插入,可以配如下的值

0:不允许并发插入,所有插入都会对表加互斥锁。

1:默认值,只要表中没有空洞,MyISAM就允许并发插入。

2:MySQL5.0以后有效,强制并发插入到表的末尾,即使表中有空洞。如果没有线程从表读取数据,MySQL将把新行放到空洞里,使用这个设置通常使表更加碎片化。


三、负载配置


当服务器在满载的情况下运行时,请尝试记录所有的查询语句,因为这是最好的方式来查看占用资源情况。

优化BLOB和TEXT的场景BLOB和TEXT对MySQL来说是特殊的类型,一个最重要的事项是,服务器不能在内存临时表中存放BLOB和TEXT值,Percona Server没有这个限制,因此如果一个查询涉及到BLOB和TEXT,又需要使用临时表,都会立即在磁盘上创建临时表。

通常使用SUBSTRING()函数把值转换为varchar可以好一点。

对于InnoDB来说,如果有很多大字段,最好是把他们组合一起来单独存到一个列里面,共享一个扩展空间,比每个字段用自己的空间要好。也可以用compress压缩后再存储为BLOB和TEXT。

当MySQL必须排序BLOB和TEXT字段时,它只会使用前缀,max_sort_length可以制定这个前缀有多大。




















本文转自shayang8851CTO博客,原文链接:http://blog.51cto.com/janephp/1321073,如需转载请自行联系原作者

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
人工智能 运维 调度
机房服务器快喘不过气?智能负载管理才是救命稻草
机房服务器快喘不过气?智能负载管理才是救命稻草
424 1
|
存储 缓存 监控
MySQL服务器配置优化:my.cnf参数调优指南
本文深入解析了MySQL核心配置参数及性能优化技巧,涵盖内存结构、调优原则、存储引擎优化、查询性能优化等内容,通过实战案例帮助读者构建高性能MySQL服务器配置,解决常见的性能瓶颈问题。
1525 0
|
消息中间件 缓存 弹性计算
纯PHP+MySQL手搓高性能论坛系统!代码精简,拒绝臃肿
本内容分享了一套经实战验证的社交系统架构设计,支撑从1到100万用户的发展,并历经6次流量洪峰考验。架构涵盖客户端层(App、小程序、公众号)、接入层(API网关、负载均衡、CDN)、业务服务层(用户、内容、关系、消息等服务)、数据层(MySQL、Redis、MongoDB等)及运维监控层(日志、监控、告警)。核心设计包括数据库分库分表、多级缓存体系、消息队列削峰填谷、CQRS模式与热点数据动态缓存。同时提供应对流量洪峰的弹性伸缩方案及降级熔断机制,并通过Prometheus实现全链路监控。开源建议结构清晰,适合大型社交平台构建与优化。
643 11
|
SQL 缓存 关系型数据库
MySQL 慢查询是怎样优化的
本文深入解析了MySQL查询速度变慢的原因及优化策略,涵盖查询缓存、执行流程、SQL优化、执行计划分析(如EXPLAIN)、查询状态查看等内容,帮助开发者快速定位并解决慢查询问题。
557 0
|
网络协议
端口最多只有65535个,为什么服务器能承受百万并发
服务器通过四元组(源IP、源端口、目标IP、目标端口)识别不同TCP连接,每条连接对应独立socket。数据包携带四元组信息,服务端据此查找对应socket进行通信。只要四元组任一元素不同,即视为新连接,可创建独立socket。资源充足时,单进程可支持百万级并发连接,socket与端口非一一对应。
752 10
端口最多只有65535个,为什么服务器能承受百万并发
|
SQL 关系型数据库 MySQL
索引设计实战:如何创建高性能MySQL索引
本文深入解析MySQL索引设计的核心原则与实战技巧,涵盖索引选择性、复合索引、性能优化及常见陷阱等内容,通过实际案例帮助开发者创建高效索引,显著提升数据库查询速度,助你打造高性能数据库系统。
|
缓存 关系型数据库 MySQL
降低MySQL高CPU使用率的优化策略。
通过上述方法不断地迭代改进,在实际操作中需要根据具体场景做出相对合理判断。每一步改进都需谨慎评估其变动可能导致其他方面问题,在做任何变动前建议先在测试环境验证其效果后再部署到生产环境中去。
457 6
|
存储 SQL 关系型数据库
MySQL 核心知识与索引优化全解析
本文系统梳理了 MySQL 的核心知识与索引优化策略。在基础概念部分,阐述了 char 与 varchar 在存储方式和性能上的差异,以及事务的 ACID 特性、并发事务问题及对应的隔离级别(MySQL 默认 REPEATABLE READ)。 索引基础部分,详解了 InnoDB 默认的 B+tree 索引结构(多路平衡树、叶子节点存数据、双向链表支持区间查询),区分了聚簇索引(数据与索引共存,唯一)和二级索引(数据与索引分离,多个),解释了回表查询的概念及优化方法,并分析了 B+tree 作为索引结构的优势(树高低、效率稳、支持区间查询)。 索引优化部分,列出了索引创建的六大原则
385 2
|
存储 SQL 关系型数据库
京东面试:mysql深度分页 严重影响性能?根本原因是什么?如何优化?
京东面试:mysql深度分页 严重影响性能?根本原因是什么?如何优化?
京东面试:mysql深度分页 严重影响性能?根本原因是什么?如何优化?

热门文章

最新文章

推荐镜像

更多