十招搞定 MySQL 大规模数据库的性能和伸缩性优化
在需要支持移动/平板电脑应用及普通桌面浏览器访问的时代,网站的普及率和有效性很大程度上取决于其可用性和性能。一个访问缓慢的网站会使得访问者或潜在的客户流失,并导致商业的失败。一个访问速度相当快的网站将会决定访客是否会使用网站提供的产品或服务。
拥有大规模数据库的网站始终需要适当的关注、配置、优化、调整和维护,以确保网站的快速加载。这篇文章将讨论如何优化有海量数据的 MySQL 数据库。
选择 InnoDB 作为存储引擎
大型产品的数据库对于可靠性和并发性的要求较高,InnoDB 作为默认的 MySQL 存储引擎,相对于 MyISAM 来说是个更佳的选择。
优化数据库结构
组织数据库的 schema、表和字段以降低 I/O 的开销,将相关项保存在一起,并提前规划,以便随着数据量的增长,性能可以保持较高的水平。
设计数据表应尽量使其占用的空间最小化,表的主键应尽可能短。
对于 InnoDB 表,主键所在的列在每个辅助索引条目中都是可复制的,因此如果有很多辅助索引,那么一个短的主键可以节省大量空间。
仅创建你需要改进查询性能的索引。索引有助于检索,但是会增加插入和更新操作的执行时间。
InnoDB 的 Change Buffering 特性
InnoDB 提供了 change buffering 的配置,可减少维护辅助索引所需的磁盘 I/O。大规模的数据库可能会遇到大量的表操作和大量的 I/O,以保证辅助索引保持最新。当相关页面不在缓冲池里面时,InnoDB 的 change buffer 将会更改缓存到辅助索引条目,从而避免因不能立即从磁盘读取页面而导致耗时的 I/O 操作。当页面被加载到缓冲池时,缓冲的更改将被合并,更新的页面之后会刷新到磁盘。这样做可提高性能,适用于 MySQL 5.5 及更高版本。
InnoDB 页面压缩
InnoDB 支持对表进行页面级的压缩。当写入数据页的时候,会有特定的压缩算法对其进行压缩。压缩后的数据会写入磁盘,其打孔机制会释放页面末尾的空块。如果压缩失败,数据会按原样写入。表和索引都会被压缩,因为索引通常是数据库总大小中占比很大的一部分,压缩可以显著节约内存,I/O 或处理时间,这样就达到了提高性能和伸缩性的目的。它还可以减少内存和磁盘之间传输的数据量。MySQL 5.1 及更高版本支持该功能。
注意,页面压缩并不能支持共享表空间中的表。共享表空间包括系统表空间、临时表空间和常规表空间。
使用批量数据导入
在主键上使用已排序的数据源进行批量数据的导入可加快数据插入的过程。否则,可能需要在其他行之间插入行以维护排序,这会导致磁盘 I/O 变高,进而影响性能,增加页的拆分。关闭自动提交的模式也是有好处的,因为它会为每个插入执行日志刷新到磁盘。在批量插入期间临时转移唯一键和外键检查也可显著降低磁盘 I/O。对于新建的表,最好的做法是在批量导入后创建外键/唯一键约束。
SQL 语句优化
为了提升查询的速度,可以为 WHERE 字句中使用的列添加索引。此外,不要将主键索引用于太多或太长的列,因为这些列值在辅助索引进行复制的时候会增加读取所需要的 I/O 资源并占用缓存。
如果索引包含了不必要的数据,通过 I/O 读取这些数据并进行缓存就会减弱服务器的性能和伸缩性。也不要为不必要的列使用唯一键索引,因为它会禁用 change buffering。应该使用常规索引代替。
减少和隔离需要耗费大量时间的函数调用。
尽可能的减少查询中的全表扫描次数。
调整缓存区域的大小和属性,比如 InnoDB 缓冲池,MySQL 查询缓存等,这样会通过从内存而非从硬盘获取数据而让重复的查询变得更快。
优化存储结构
对于大型的表,或者包含大量重复文本或数值数据的表,应该考虑使用 COMPRESSED(压缩的) 行格式。这样只需要较少的 I/O 就可以把数据取到缓冲池,或执行全表扫描。
一旦你的数据达到稳定的大小,或者增长的表增加了几十或几百兆字节,就应该考虑使用 OPTIMIZE TABLE 语句重新组织表并压缩浪费的空间。对重新组织后的表进行全表扫描所需要的 I/O 会更少。
优化 InnoDB 磁盘 I/O
增加 InnoDB 缓冲池大小可以让查询从缓冲池访问而不是通过磁盘 I/O 访问。通过调整系统变量 innodb_flush_method 来调整清除缓冲的指标使其达到最佳水平。
使用其它存储设备配置 RAID。
MySQL 的内存分配
在为 MySQL 分配足够的内存之前,请考虑不同领域对 MySQL 的内存需求。
要考虑的关键领域是:并发连接 —— 对于大量并发连接,排序和临时表将需要大量内存。在撰写本文时,对于处理 3000+ 并发连接的数据库,16GB 到 32GB的 RAM 是足够的。
内存碎片可以消耗大约 10% 或更多的内存。像 innodb_buffer_pool_size、key_buffer_size、query_cache_size 等缓存和缓冲区要消耗大约 80% 的已分配内存。
日常维护
定期检查慢的查询日志并优化查询机制以有效使用缓存来减少磁盘 I/O。优化它们,以扫描最少的行数,而不是进行全表扫描。
其他可以帮助 DBA 检查和分析性能的日志包括:错误日志、常规查询日志、二进制日志、DDL日志(元数据日志)。
定期刷新缓存和缓冲区以降低碎片化。使用 OPTIMIZE TABLE 语句重新组织表并压缩任何可能被浪费的空间。
另外还有一点可以通过自身的学习来获取一大进步。
分享给超过5万的程序员朋友下载,这次我把所有干货重新梳理精简,免费给大家 。
究竟有哪些干货呢?先给你们一个目录:
获取方式:
免费获取资料途径:共众平台 “程序员语录"(你懂的)
十招搞定 MySQL 大规模数据库的性能和伸缩性优化相关推荐
- mysql大规模读写性能_十招搞定 MySQL 大规模数据库的性能和伸缩性优化
点击图片报名参加广州&珠海源创会 在需要支持移动/平板电脑应用及普通桌面浏览器访问的时代,网站的普及率和有效性很大程度上取决于其可用性和性能.一个访问缓慢的网站会使得访问者或潜在的客户流失,并 ...
- 十招搞定SQL2K安全
十招搞定SQL2K安全 本文详述提高SQL Server 2K安装的安全性实施的十个注意事项: 1.安装最新的服务包 为了提高服务器安全性,最有效的一个方法就是升级到 SQL Server 2000 ...
- 轻松八句话 教会你完全搞定MySQL数据库(基础)
2019独角兽企业重金招聘Python工程师标准>>> 本文让你用轻松八句话就可教会你完全搞定MySQL数据库. 一.连接MYSQL 格式: mysql -h主机地址-u用户名-p用 ...
- java 分组报表_【Java】分组报表怎么做,积木报表十分钟搞定!
首页 专栏 java 文章详情 0 分组报表怎么做,积木报表十分钟搞定! scott发布于 今天 12:24 报表需求 某大型超市需要做一张年度区域销售统计报表 展示2019和2020年度各地区每月的 ...
- 六招搞定你爱的坏男人
"坏"男人肖像 就像猛兽才能独处,"坏"男人都是多少有些嚣张和跋扈,常常让你感觉到非怎么样不可也就是毋庸置疑的人,坏男人如猛虎.如鹰隼.如箭猪.如雄马.如烈酒, ...
- 一招搞定高等数学! | 今日最佳
世界只有3.14 % 的人关注了 青少年数学之旅 @瓜皮儿十三妹 @没品图 一张图让你们看看鲨鱼的 血液循环系统到底有多复杂 @普外科曾医生 小猪佩奇其实是"巨猪佩奇" 小猪佩奇真 ...
- JeecgBoot 单体升级微服务快速方案(十分钟搞定)
JeecgBoot 单体升级微服务方案(十分钟搞定) 当前系统分为system.demo 等模块,现有需求把每个模块单独启动作为微服务应用,故而推出新版boot[20200812beta],支持快速切 ...
- 简单一招搞定公司牛人 转自 潘文富
简单一招搞定公司牛人 潘文富 所谓公司牛人,就是在老板之下,众员工之上的人物.公司牛人,有的是凭借资历,有的是身居高位的职业经理人,有的是凭借自己在某方面的专业水平和经验,总之,有牛的资本. 这些牛人 ...
- 逗号后面统一加空格_十分钟搞定字幕,教你做加字幕的“快手菜”
平台上许多同学有疑问:做视频是否有加字幕的必要呢? 其实除了外语需要翻译.语速过快加字幕方便理解.普通话不标准等情况之外,还是建议有余力的同学可以加上字幕,提升用户的观看体验. 那么问题来了,存在以下 ...
最新文章
- 第6周小组作业:软件测试和评估
- 【Mysql】日期、行变列(IF、CASE WHEN THEN)语句总结
- 程序员学霸!top2大学毕业!不到30岁第一次升P9失败!挫折感极强,怀疑人生?网友:没升P7的我,不要面子的吗??...
- 拼多多java开发一面、二面合并面经
- USACO Training Section 1.1 贪婪的送礼者Greedy Gift Givers
- [转]Aptana Studio 3配置Python开发环境图文教程
- 设计模式学习之---Adapter(适配器)模式
- DotNetNuke(DNN) 中查询所有管理员的SQL语句
- NvRam增加记录恢复出厂设置次数(下)
- 托福百日冲刺—词汇(14)
- 全球及中国酒店保险箱行业发展现状及需求前景预测报告*2022-2027
- JS时间的计算,剩余时间的计算
- c语言 一帮一题目,【精品资料】大学优秀学子风采录.doc
- 微信小程序-编写图标的方法
- epoch, batch, iteration
- FastAdmin表单工具栏自定义按钮
- 域管理:windows server分发与分配软件
- 视频教程-怎么架构生产数据库--生产数据库优化的一种方式-MySQL
- Node.js stream模块(一)可读流
- C语言学习22.9.4
热门文章
- TZOJ 1321 Girls and Boys(匈牙利最大独立集)
- Apk打包-签名过程
- Learning to Rank算法介绍:RankSVM 和 IR SVM
- Model-View-Presenter模式之 Step by Step
- 用putty中的pscp命令拷贝文件
- ssh免密登录(普通用户和root用户)
- 「2017 山东一轮集训 Day2」Pair (霍尔定理+线段树)
- 安卓开发创建活动,布局,添加按钮,she使用Toast,设菜单,使菜单相关联等操作...
- LINQ中判断日期时间段
- WORD 粘贴代码 不检查语法