背景:

  笔者的源数据一张表大概7000多万条,数据大小36G,索引6G,加起来表空间有40G+,类似的表有4张,总计2亿多条

数据库mysql,引擎为innodb,版本5.7,服务器内存256G,物理内存几个T,硬件参数杠杠的,然而处理这些数据踩了不少坑,因

为之前没做过这方面的工作,现在记录下清洗的过程,详细的业务清洗过程和规则均记录在https://gitee.com/yanb618/zhirong/wikis

感受:

  清洗从表名,字段名,字段类型,字段值,索引创建与删除做起,每每看到那秒数慢慢的涨到几千秒,心中一首凉凉唱起来

假设这个速度,一天下来甚至只能处理一张表,之前的工作经历从来没有做过性能调优,正好这次尝到了苦头,记录之

在描述之前先插一句:一定要先做实验,做实验!看执行时间,这么大的一张表,处理不好执行起来得以小时记,连取消都得等好久

预备:

  首先读者要分清楚Innodb和Myisam两种引擎的区别:Innodb有完整的事物支持,行锁,B-Tree/Hash索引;Myisam支持表锁,

不支持事物,有FullText索引,适用于快速读取;

  其次,临时数据能在内存中读写操作的就不要往磁盘上读写

具体:

配置temp_table_sizemax_heap_table_size,下面是官网说明

tmp_table_size

Command-Line Format --tmp-table-size=#
System Variable Name tmp_table_size
Scope Global, Session
Dynamic Yes
Permitted Values Type integer
Default 16777216
Minimum 1024
Maximum 18446744073709551615 The maximum size of internal in-memory temporary tables. This variable does not apply to user-created MEMORY tables.
The actual limit is determined from whichever of the values of tmp_table_size and max_heap_table_size is smaller. If an in-memory temporary table exceeds the limit, MySQL automatically converts it to an on-disk MyISAM table.
Increase the value of tmp_table_size (and max_heap_table_size if necessary) if you do many advanced GROUP BY queries and you have lots of memory. You can compare the number of internal on-disk temporary tables created to the total number of internal temporary tables created by comparing
the values of the Created_tmp_disk_tables and Created_tmp_tables variables. See also Section 8.4.4, “Internal Temporary Table Use in MySQL”.
max_heap_table_size

Command-Line Format --max-heap-table-size=#
System Variable Name max_heap_table_size
Scope Global, Session
Dynamic Yes
Permitted Values (32-bit platforms) Type integer
Default 16777216
Minimum 16384
Maximum 4294967295
Permitted Values (64-bit platforms) Type integer
Default 16777216
Minimum 16384
Maximum 1844674407370954752 This variable sets the maximum size to which user-created MEMORY tables are permitted to grow.
The value of the variable is used to calculate MEMORY table MAX_ROWS values.
Setting this variable has no effect on any existing MEMORY table, unless the table is re-created with a statement such as CREATE TABLE
or altered with ALTER TABLE or TRUNCATE TABLE. A server restart also sets the maximum size of existing MEMORY tables to the global max_heap_table_size value. This variable is also used in conjunction with tmp_table_size to limit the size of internal in-memory tables.
See Section 8.4.4, “Internal Temporary Table Use in MySQL”. max_heap_table_size is not replicated. See Section 17.4.1.20, “Replication and MEMORY Tables”, and Section 17.4.1.38, “Replication and Variables”, for more information.

通常在执行一个耗时很长的更新表操作时查看show processlist命令可以看到如下信息

Copying to tmp table   Copying to tmp table on disk

后者表示内存临时表空间不够,需要往硬盘写,这个很要命,临时查询数据部分在内存部分在硬盘,读写速度骤降

调整这两个参数的大小为40G或者更大都行,你的服务器内存足够大的话可以继续往上调,笔者因为有select into 重构表的需求,

一次读出来的数据很大,因此需要调高默认值

innodb_buffer_pool_size

innodb缓冲池,以下是他的职责场景

* 数据缓存 – 最重要的目的
* 索引缓存 – 使用的是同一个缓冲池
* 缓冲 – 更改的数据(通常称为脏数据)在被刷新到硬盘之前先存放到缓冲
* 存储内部结构 – 一些结构如自适应哈希索引或者行锁也都存储在InnoDB缓冲池

很幸运的是我们的服务器是独立的划分给mysql了,根据坊间经验设置为总可用内存的80%,在这里总内存256G,完成这个清洗

设置100G已经足矣,我们需要这个空间来存临时查询的数据,大数据量下尽量避免临时数据在内存和磁盘间交换带来的IO性能影响

bulk_insert_buffer_size

笔者的清洗方式其中一种是多线程读取+插入,插入采用批量插入的方式,insert into tbl_name values(),(),(),这个参数可以设置插入

的语句的长度大小,java中String一般是没有长度限制的(除非jvm装不下),如果需要大批量的拼接insert语句,需要加大这个参数值

当然这个值其实是专门给Myisam存储引擎设计的,设置这个参数后还要配合设置如下参数一起用才能飞起,否则会直接报错

Max_allowed_packet=100M,最大值1G

其他的参数优化暂时未使用到,如果是正常的小型的项目数据量不是很大的情况下,一般建议是:使用默认值,不要更改,不要更改

道理很简单:很多企业开发时都不会去调这些参数,这也意味着默认设置经历过最多次的压力测试,除非你已经到了不得不去优化的地步

Mysql千万级数据性能调优配置的更多相关文章

  1. [转帖]Mysql 最简单的参数调优配置

    http://blog.jobbole.com/113659/ 我并不期望成为一个专家级的 DBA,但是,在我优化 MySQL 时,我推崇 80/20 原则,明确说就是通过简单的调整一些配置,你可以压 ...

  2. mysql 开启日志与性能调优

    #查看日期情况 #show variables like '%general%'; #开启日志 #SET GLOBAL general_log = 'On'; #指定日志文件 #SET GLOBAL  ...

  3. MySql(十一):MySQL性能调优——常用存储引擎优化

    一.前言 MySQL 提供的非常丰富的存储引擎种类供大家选择,有多种选择固然是好事,但是需要我们理解掌握的知识也会增加很多.本章将介绍最为常用的两种存储引擎进行针对性的优化建议. 二.MyISAM存储 ...

  4. MySQL性能调优与架构设计——第11章 常用存储引擎优化

    第11章 常用存储引擎优化 前言: MySQL 提供的非常丰富的存储引擎种类供大家选择,有多种选择固然是好事,但是需要我们理解掌握的知识也会增加很多.每一种存储引擎都有各自的特长,也都存在一定的短处. ...

  5. MySQL性能调优与架构设计——第1章 MySQL 基本介绍

    第1章 MySQL 基本介绍 前言:作为最为流行的开源数据库软件之一, MySQL 数据库软件已经是广为人知了. 但是为了照顾对MySQL还不熟悉的读者,这章我们将对 MySQL 做一个简单的介绍.主 ...

  6. MySQL性能调优与架构设计——第6章 MySQL Server 性能的相关因素

    第6章 MySQL Server 性能的相关因素 前言 大部分人都一致认为一个数据库应用系统(这里的数据库应用系统概指所有使用数据库的系统)的性能瓶颈最容易出现在数据的操作方面,而数据库应用系统的大部 ...

  7. MySQL性能调优与架构设计——第3章 MySQL存储引擎简介

    第3章 MySQL存储引擎简介 3.1 MySQL 存储引擎概述 MyISAM存储引擎是MySQL默认的存储引擎,也是目前MySQL使用最为广泛的存储引擎之一.他的前身就是我们在MySQL发展历程中所 ...

  8. mysql监控、性能调优及三范式理解

    原文:mysql监控.性能调优及三范式理解 1监控 工具:sp on mysql     sp系列可监控各种数据库 2调优 2.1 DB层操作与调优 2.1.1.开启慢查询 在My.cnf文件中添加如 ...

  9. 性能调优案例分享:Mysql的cpu过高

    性能调优案例分享:Mysql的cpu过高   问题:一个系统,Mysql数据库,数据量变大之后.mysql的cpu占用率很高,一个测试端访问服务器时mysql的cpu占用率为15% ,6个测试端连服务 ...

随机推荐

  1. ionic js 滑动框ion-slide-box 滑动框是一个包含多页容器的组件,每页滑动或拖动切换

    ionic 滑动框 ion-slide-box 滑动框是一个包含多页容器的组件,每页滑动或拖动切换: 效果图如下: 用法 <ion-slide-box on-slide-changed=&quo ...

  2. 威布尔weibull distribution

    data = wblrnd(0.5,0.8,100,1); 生成威布尔随机函数,尺寸参数为0.5,形状参数为0.8,生成数列100行,一列: parmhat = wblfit(data) 对data的 ...

  3. 【数位DP】CF55D Beautiful numbers

    $dp[x][p][pp]$表示第x位,当前已有数字mod 2520(1~9数字的lcm)为p,当前各位数字的lcm为pp 观察到数组太大,考虑压缩,第三维lcm最多只有9个数字,打表发现最多只有48 ...

  4. Python学习笔记(三)——文件系统中的常用方法

    OS模块中关于文件/目录常用的函数使用方法 函数名 使用方法 getcwd() 返回当前工作目录 chdir() 改变工作目录 listdir(path='.') 列举指定目录中的文件名('.'表示当 ...

  5. ECharts (mark)

    首页 文档 下载 实例 社区 工具 关于 2.0 EN ECharts 特性 特性 丰富的可视化类型 多种数据格式无需转换直接使用 千万数据的前端展现 移动端优化 多渲染方案,跨平台使用! 深度的交互 ...

  6. java字符串简单介绍

    String:String对象初始化之后不可变线程安全简单的字符串操作使用String效率更高 StringBuffer:StringBuffer对象初始化之后可改变线程安全频繁的字符串操作可以使用S ...

  7. Windows 设置内网和外网同时使用

    想要电脑同时使用内网和外网必须具备两个网卡,一个是无线网卡一个是本地连接,无线网卡用来连接wifi也就是外网,而本地连接需要网线连接内网,外网是不需要做设置的,我们只需要设置内网即可,鼠标右击电脑右下 ...

  8. 剑指Offer-13:调整数组位置使奇数位于偶数前面

    题目描述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变.例如给定一个数组 ...

  9. 如何区分无线AP跟无线路由器

    无线AP是一个无线网络的接入点,俗称“热点”.主要有路由交换接入一体设备和纯接入点设备,一体设备执行接入和路由工作,纯接入设备只负责无线客户端的接入,纯接入设备通常作为无线网络扩展使用,与其他AP或者 ...

  10. ElasticJob-分布式作业调度神器,你们还在用Quartz吗?!

    简介 Elastic-Job是一个分布式调度解决方案,由两个相互独立的子项目Elastic-Job-Lite和Elastic-Job-Cloud组成. Elastic-Job-Lite定位为轻量级无中 ...