1.影响数据库性能的几个方面
服务器硬件
服务器系统
数据库存储引擎的选择(MySQL的插件式存储引擎)
MyISAM:不支持事务,表级锁。
InnoDB:事务级存储引擎,完美支持行级锁,事务ACID特性。
数据库参数配置
数据库结构设计和SQL语句的编写和优化
2.CPU资源和可用内存大小(服务器硬件)
对MySQL性能有影响的硬件资源:CPU资源和可用内存大小
(1)目前版本的MySQL不支持多CPU对同一SQL的并发处理。
(2)内存的大小直接影响了数据库的效率。
(3)MyISAM把索引缓存到内存中,而数据通过操作系统来进行缓存。
(4)InnoDB会同时在内存中缓存数据和索引,从而提高数据库运行效率。
(5)内存虽然是越多越好,但是对性能的影响是有限的,并不能通过增加内存来无限的增加性能。
(6)在读取数据时,先读取缓存,缓存没有再读取硬盘;在写入数据时,也可以将数据写入缓存,然后将多次写入变成一次写入,将数据一次性从缓存写入硬盘。
(7)选择内存时应该选择服务器主板支持的最大内存频率,频率越高速度越快。
3.磁盘的配置和选择
无论如何,数据最终都要在磁盘上实现永久存储,所以IO子系统比内存更加重要。
常用的磁盘IO系统:
使用传统机器硬盘:
特点:最常见,使用最多,价格性对低,存储空间较大,读写速度较慢。
传统机器硬盘读取数据的过程:
移动磁头到磁盘表面上的正确位置
等待磁盘旋转,使的所需的数据在磁头之下
等待磁盘旋转过去,所有所需的数据都被磁头读出
(1,2为访问时间。3为传输时间)
如何选择传统机器硬盘:
存储容量
传输速度
访问时间
主轴转速
物理尺寸
使用RAID增强传统机器硬盘的性能:
概述:RAID是磁盘冗余队列的简称。简单来说RAID的作用就是可以把多个容量较小的磁盘组成一组容量更大的磁盘,并提供数据冗余来保证数据完整性的技术。
常用RAID级别:
RAID 0:最早出现的RAID模式,也称之为数据条带。是组建磁盘阵列中最简单的一种形式,只需要2块以上的硬盘即可,成本低,可以提高整个磁盘的性能和吞吐量。RAID 0没有提供冗余或错误修复能力,但是实现成本是最低的。
RAID 1:又称为磁盘镜像,原理是把一个磁盘的数据镜像到另一个磁盘上,也就是说数据在写入一块磁盘的同时,会在另一块闲置的磁盘上生成镜像文件,在不影响性能情况下最大限度的保证系统的可靠性和可修复性。
RAID 5:又称之为分布式奇偶校验磁盘阵列。通过分布式奇偶检验块把数据分散到多个磁盘上,这样如果任何一个盘数据失效,都可以从奇偶校验块中重建。但是如果两块磁盘失效,则整个卷的数据都无法恢复。
RAID 10 :又称分片的镜像。它是对磁盘先做RAID 1之后对两种RAID 1的磁盘再做RAID 0,所以对读写都有良好的性能,相对于RAID 5 重建起来更简单,速度也更快。
使用固态存储SSD和PCIE卡:
特点:相比机械磁盘固态磁盘有更好的随机读写性能,能更好的支持并发,但是也更容易损坏。
使用场景:
适用于存在大量随机I/O的场景
适用于解决单线程负载的I/O瓶颈
使用网络存储NAS和SAN:
含义:NAS和SAN是两种外部文件存储设备加载到服务器上的方法。
区别:
SAN设备通过光纤连接到服务器,设备通过块接口访问,服务器可以将其当做硬盘使用。顺序读写快,随机读写慢。
NAS设备使用网络连接,通过基于文件的协议如NFS或SMB来访问。
网络存储使用的场景:
并不适合MySQL数据库存储数据文件。
适合数据库备份
4.MySQL体系结构
客户端
MySQL服务层:包括连接管理器、查询缓存、查询解析、查询优化器。比如select语句也是在MySQL服务层来实现的。
存储引擎层:存储引擎是针对于表的而不是针对于库的(一个库中的不同表可以使用不同的存储引擎)
5.MySQL常用存储引擎之MyISAM
1.MySQL5.5之前版本默认存储引擎
2.MyISAM存储引擎表由MYD(数据文件)和MYI(索引文件)组成
3.MyISAM的特性:
并发性与所级别
表损坏修复
MyISAM表支持的索引类型(全文索引)
MyISAM表支持数据压缩
4.MyISAM的限制:
版本 如存储大表则要修改MAX_Rows和AVG_ROW_LENGTH 版本>MySQL5.0时默认支持为256TB 5.适用场景: 非事务型应用 只读类应用 空间类应用 Innodb使用表空间进行 数据存储 参数:innodb_file_per_table 参数为on,则表示独立表空间:tablename.ibd; 参数为OFF,则表示系统表空间:ibdataX. 系统表空间和独立表空间要如何选择: 系统表空间无法简单的收缩文件大小 独立表空间可以通过optimize table命令收缩系统文件 系统表空间会产生IO瓶颈 独立表空间可以同时向多个文件刷新数据 建议: 对Innodb使用独立表空间 把原来存在于系统表空间中的表转移到独立表空间中的方法: 使用mysqldump导出所有数据库表数据 停止MySQL服务,修改参数,并删除Innodb相关文件 重启MySQL服务,重建Innodb系统表空间 重新导入数据 Innodb存储引擎的特性 Innodb是一种事务型存储引擎 完全支持事务的ACID特性 日志类型:Redo Log 和 Undo Log Redo Log 实现事务的持久性 存储的是已经提交的事务(提交失败或者回滚),顺序写入。 Undo Log 实现的是未提交的事务,随机读写。 Innodb支持行级锁 行级锁可以最大程度的支持并发 行级锁是由存储引擎层实现的 什么是锁 锁的主要作用是管理共享资源的并发访问 锁用于实现事务的隔离性 锁的类型 共享锁(读锁) 独占锁(写锁) 锁的粒度 表级锁 行级锁 阻塞和死锁 什么是阻塞:事务中的兼容性关系,比如一个事务的锁需要等待另一个事务的锁的释放。 什么是死锁:两个或者两个以上的事务,在执行过程中,相互占用了对方等待的资源。数据库系统会自动发现死锁,可以由系统自动处理。处理方式是:将死锁中占用资源最少的事务回滚,能使其他事务进行下去。 Innodb状态检查 提供了一个独特的性能监控工具:show engine innodb status。如果想使用要在两次间隔时间至少30秒。 使用场景 MySQL5.7版本之后开始支持全文索引和空间函数。 文件系统存储特点: 数据以文本方式存储在文件中 .CSV文件存储表内容 .CSM文件存储表的元数据如表状态和数据量 .frm文件存储表结构信息 特点: 以CSV格式进行数据存储 所有列必须都是不能为NULL的 不支持索引,不适合大表,不适合在线处理 可以对数据文件直接编辑,保存文本文件内容 使用场景: 适合作为数据交换的中间表。可以将电子表格(excel)存储为CSV文件,存储到MySQL数据目录下。 文件系统存储特点: 以zlib对表数据进行压缩,磁盘I/O更少 数据存储在ARZ为后缀的文件中 Archive存储引擎的特点: 只支持insert和select操作 只允许在自增ID列上加索引 使用场景: 日志和数据采集类应用 文件系统存储特点: 也称为HEAP存储引擎,所以数据保存在内存中。 功能特点: 支持HASH索引和BTree索引 HASH索引适合等值查找 BTree索引适合范围查找 所有字段都为固定长度 varchar(10)= char(10) 不支持BLOG和TEXT等大字段 Memory存储引擎使用表级锁 最大大小由max_heap_table_size参数决定 容易混淆的概念: Memory存储引擎表: 临时表: 系统使用临时表: 超过限制使用Myisam临时表 未超限制使用Memory表 create temporary table 建立的临时表: 使用场景: 用于查找或者是映射表,例如邮编和地区的对应表 用于保存数据分析中产生的中间表 用于缓存周期性聚合数据的结果表 特点: 提供了访问远程MySQL服务器上表的方法 本地不存储数据,数据全部放到远程服务器上 本地需要保存表结构和远程服务器的连接信息 如何使用: 默认禁止,启用需要在启动时增加federated参数 mysql://user_name[:password]@host_name[:port_num]/db_name/tbl_name user_name,password:本地连接到远程的用户名和密码 host_name:远程MySQL服务器的IP port_num:远程MySQL服务器的端口号 db_name:我们所要在本地去映射的服务器的名字 tbl_name:映射的表的名字 使用场景: 偶尔的统计分析及手工查询 参考条件: 事务 备份 崩溃恢复 存储引擎的特有特性 MySQL获取配置信息路径: 命令行参数:mysqld_safe -- datadir=/data/sql_data 配置文件 MySQL配置参数的作用域 全局参数 set global 参数名=参数值; set @@global.参数名 :=参数值; 会话参数 set【session】参数名 = 参数值; set@@session.参数名:= 参数值; 内存配置相关参数: 确定可以使用的内存的上限 确定需要为操作系统保留多少内存 如何为缓存池分配内存 Innodb_buffer_pool_size 总内存 - (每个线程所需要的内存*连接数)- 系统保留内存 key_buffer_size(MyISAM) 确定MySQL的每个连接使用的内存 sort_buffer_size join_buffer_size read_buffer_size read_rnd_buffer_size 安全相关配置参数: 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 no_zero_in_date only_full_group_by6.MySQL常用存储引擎之Innodb
7.MySQL常用存储引擎之CSV
8.MySQL常用存储引擎之Archive
9.MySQL常用存储引擎只Memory
10.MySQL常用存储引擎之Federated
11.如何选择正确的存储引擎
12.MySQL服务器参数