性能指标:
QPS(query per second)每秒处理的查询请求数
TPS (transaction per second)每秒处理的事务数
1.服务器硬件的性能;包括CPU,内存,IO,网络性能等
2.服务器系统参数优化
3.mysql存储引擎的选择;MYISAM 不支持事务,表级别锁; INNODB:支持事务,支持表锁和行锁
4.mysql参数优化 ;如最大连接数,缓存大小
5.数据库结构设计及sql语句性能
优化的优先级
1.数据库结构设计及sql语句性能
2.数据库存储引擎的选择与参数的优化
3.系统选择与优化
4.硬件优化
如何选择系统的硬件配置?
CPU:、
是选择更多的CPU呢?还是更快的CPU呢?如果不计成本的情况下,肯定是两者兼得。如果成本有限我们可以根据以下的方式选择。
当我们的服务单个sql的处理数据较多,我们可以选择更快的cpu,提高单sql的性能;
如果服务的并发量较大,可以选择配置更多的CPU。因为CPU的数量会影响数据库的并发量,如32核心CPU 可以使数据库同时处理32个请求;
1.64位CPU运行在64位的系统下
2.对于并发高的场景CPU的数量比频率重要
3.对于CPU密集型的场景或复杂sql的场景CPU频率比较重要
内存:
内存可以减少磁盘的IO,提高我们sql的查询性能;但是内存的增加也是有瓶颈的,如果内存已经超过了mysql数据的大小,再增加内存已经不能提高mysql的性能了。
MyISAM:把索引缓存到内存,数据存储到磁盘中
InnoDb:把索引和数据都存储到内存中。
磁盘:
磁盘的性能指标包括容量和IO性能,目前容量已经不是性能的瓶颈了,如果对IO要求较高可以选择ssd固态硬盘,否则选择机械硬盘就可以了。
网络:
1.尽可能使用高性能和高带宽的硬件接口设备
2.保证网络的质量,如出现丢包的情况会影响数据的传输
3.做好网络的隔离,防止数据库暴露在外网环境中。防止安全风险。
存储引擎的选择?
mysql的存储引擎是基于表的,既同一个数据库中每个表可以设置不同的引擎,只需要在创建表的时候使用engine=innodb即可;
但是在生产的环境中不建议混合使用,
一个事务中,同时操作innodb和myisam引擎的表,如果事务回滚myisam表不会回滚会出现数据一致性的问题。
适用于非事务应用,只读类应用,
是mysql5.5之前的默认存储引擎。
1不支持事务,
2支持表锁,不支持行锁。由于锁的粒度较大因此并发性能较差。
3.表的索引和数据文件是分开存储的
以user表为例,user.MYD存储数据;user.MYI存储索引;user.frm存储表的结构信息
4.支持表数据的压缩,压缩后表的数据只能读取,不能修改。
压缩命令 myisampack
1.5.5之后默认的存储引擎
2.支持事务 ACID 特性
3.支持表锁和行锁
4.数据和索引存储在一个文件中 *.ibd *.frm存储表结构信息
5.innodb 表空间,分为独立表空间和系统表空间,通过innodb_file_per_table 指定ON独立表空间,OFF系统表空间
6.事务的redo.log和undo.log,redo.log记录已经提交的事务;undo.log记录未提交的事务,用来实现事务的回滚。redo.log和undo.log主要用来实现 事务的原子性,一致性和持久性。锁机制主要实现事务的隔离性。
7.innodb状态检查 show engine innodb status
两种表空间的对比
1.系统表空间在数据删除后,文件的空间不会减小(只能将数据导出,删除mysql文件,重新导入表的方式减小文件空间,操作繁琐)
2.独立表空间在数据删除后,可以通过optimize table命令收缩系统文件
3.系统表空间存储io瓶颈,因为所有的表都存储在一个文件中,并发读写存储性能问题
4.独立表空间可以同时向多个文件刷新数据。
建议innodb引擎使用独立的表空间存储。mysql5.6 之后独立的表空间已经是默认的配置。
对于mysql5.6之前的数据库如何将系统表空间转为独立表空间呢?
1.使用mysqldump 导出所有数据库表数据
2.停止mysql服务,修改参数,并删除innodb相关的文件
3,重启mysql服务,重建系统表空间
4.重新导入数据
适合作为数据交换的中间表。
1.以数据csv文件的方式存储数据
.csv存储表的内容
.CSM存储表的元数据和表状态和数据量
.frm存储表的结构信息
2.创建表时所有的列都不能是NULL
3.不支持索引 不适合大表,不适合在线处理
4.可以对文件内容直接编辑
适用日志和数据采集系统
1.已zlib对表的数据进行压缩,减少磁盘IO
2.数据存储在ARZ后缀的文件中
3.支持insert和select操作
4.只支持在自增id列上建立索引
1.所有的数据都保存在内存中
2.表结构存储在frm后缀的文件中 因此重启后数据会丢失,表结构不会丢失。
3.支持HASH索引和BTree索引 默认HASH索引
hash索引等值查询快,范围查询慢
4.所有的字段都为固定的长度。
5.不支持BLOG和TEXT大字段类型
6.Memory使用是表级锁
7.max_heap_table_size 设置表的大小
mysql锁的作用:
1.管理共享资源的并发访问
2.锁用来实现事务的隔离性
锁类型
1.共享锁(读锁) 读锁与读锁是兼容的
2.独占锁(写锁) 写锁与读写锁都不兼容
锁的粒度
行级锁
表级锁 加锁 lock table tableName write|read ;释放锁 unlock table;
锁的阻塞:一个事务的请求的锁被另一个事务占用,而导致请求锁的事务阻塞。
死锁:两个事务请求的锁被互相占用,导致两个事务都阻塞,叫死锁。mysql系统会自动处理死锁,当检测到死锁时,会自动对资源占用少的事务进行回滚操作。
1.命令行参数,在启动mysql时指定的参数
2.配置文件参数,mysql启动时从配置文件读取的参数
mysqld --help --verbose |grep -A 1 ‘Default options’ ;查看mysql配置文件的读取顺序;如果同一个参数配置多次,后面读取的配置会覆盖前面的读取配置。
命令行设置的参数的优先级大于配置文件设置的参数。
参数的设置方式:
set global paramName=value;设置全局参数,
set session paramName=value;设置会话的参数,对其它会话不起作用
1.mysql每个连接使用的内存
sort_buffer_size 排序缓存,只有在连接需要排序时才会分配
join_buffer_size 连接缓存,只有在session在做表连接时才会分配,多次连接会分配多次
read_buffer_size myisam引擎在做全表扫描时的缓存
read_rnd_buffer_size 索引缓存区,只有在需要时才会分配
2.缓存池分配内存
innodb_buffer_pool_size innodb缓存池的大小,影响innodb的性能,
设置方式 系统总内存-(每个线程需要内存*连接数)-系统预留内存
key_buffer_size myisam索引的缓存
查询系统myisam索引的大小
select sum(index_length) from information_schema.tables where engine=‘myisam’
innodb I/O相关配置
innodb_log_file_size innodb事务日志文件的大小,建议能缓存1个小时的事务日志
innodb_log_files_in_group 事务文件的个数
事务日志的总大小=innodb_log_file_size *innodb_log_files_in_group
innodb事务日志的刷新过程
client提交事务—>innodb事务缓存—>写到操作系统—>事务文件中
innodb_log_buffer_size 控制事务日志缓冲区大小,不需要设置过大,因为缓冲区一般1s会刷新一次到磁盘
innodb_flush_log_at_trx_commit 事务日志的刷新频率
0:每秒进行一次log写入cache,并flush log到磁盘;此方式可能会丢失1s的事务
1:默认,每次事务提交执行log写入cache,并flush log到磁盘
2:每次事务提交,执行log数据写入到cache,每秒执行一次flush log到磁盘
innodb_flush_method=O_DIRECT 事务日志的刷新方式,O_DIRECT 关闭操作系统的缓存,避免mysql与操作系统的双重缓存。
myisam I/O相关参数
delay_key_write
OFF:每次写操作后刷新键缓冲中的脏块到磁盘
ON:只对在建表时指定了delay_key_write选项的表使用延迟刷新
ALL:对所有的myisam表使用延迟刷新
expire_logs_days 指定自动清空binlog的天数
max_allowed_packet 控制mysql可以接受包的大小 主从模式下,从库要与主库设置一致,如果从库设置过小,可能会出现复制失败的情况
skip_name_resolve 禁用DNS查找
sysdate_is_now 确保sysdate()返回确定的日期
read_only 禁止非super权限用户的写操作,主从模式下,从库建议开启
skip_slave_start 禁用slave自动启用复制,
sql_mode 设置mysql所使用的sql模式
strict_trans_tables
no_engine_subtitution 检查建表时指定的存储引擎是否可用。
no_zero_date 日期字段中不能有0000-00-00的值
no_zero_in_date 日期字段中不能有00的值
max_connections 最大连接数
命令格式 | 命令说明 |
---|---|
show variables like ‘%innodb%’ | 查询系统参数配置 |
set global paramName=value | 修改系统参数配置 |
show engine innodb status | 检查innodb 引擎的状态 |
show create table tableName | 查看创建表的语句 |
innodb_file_per_table | [ON|OFF]innodb表空间存储方式 ,ON 单独存储 tableName.ibd; OFF 共同存储 ibdataX |
影响性能的设计
1.为表建立过多的列
2.查询使用过多的表关联
3.外键保证数据的完整性,外键在做数据插入或删除时,会对外键进行验证影响性能,
4.OLTP环境中使用不恰当的表分区
ps:
OLTP与OLAP的介绍
数据处理大致可以分成两大类:联机事务处理OLTP(on-line transaction processing)、联机分析处理OLAP(On-Line Analytical Processing)。OLTP是传统的关系型数据库的主要应用,主要是基本的、日常的事务处理,例如银行交易。OLAP是数据仓库系统的主要应用,支持复杂的分析操作,侧重决策支持,并且提供直观易懂的查询结果。
OLTP 系统强调数据库内存效率,强调内存各种指标的命令率,强调绑定变量,强调并发操作;
OLAP 系统则强调数据分析,强调SQL执行市场,强调磁盘I/O,强调分区等。