美文网首页
究竟是什么影响了MySQL的性能

究竟是什么影响了MySQL的性能

作者: Wangtwodog | 来源:发表于2018-12-19 11:45 被阅读0次

    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的限制:

        版本<MySQL5.0时默认表大小为4G

        如存储大表则要修改MAX_Rows和AVG_ROW_LENGTH

        版本>MySQL5.0时默认支持为256TB

    5.适用场景:

        非事务型应用

        只读类应用

        空间类应用

    6.MySQL常用存储引擎之Innodb

    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版本之后开始支持全文索引空间函数

    7.MySQL常用存储引擎之CSV

    文件系统存储特点:

        数据以文本方式存储在文件中

        .CSV文件存储表内容

        .CSM文件存储表的元数据如表状态和数据量    

        .frm文件存储表结构信息

    特点:

        以CSV格式进行数据存储

        所有列必须都是不能为NULL的

        不支持索引,不适合大表,不适合在线处理

        可以对数据文件直接编辑,保存文本文件内容

    使用场景:

        适合作为数据交换的中间表。可以将电子表格(excel)存储为CSV文件,存储到MySQL数据目录下。

    8.MySQL常用存储引擎之Archive

    文件系统存储特点:

        以zlib对表数据进行压缩,磁盘I/O更少

        数据存储在ARZ为后缀的文件中

    Archive存储引擎的特点:

        只支持insert和select操作

        只允许在自增ID列上加索引

    使用场景:

        日志和数据采集类应用

    9.MySQL常用存储引擎只Memory

    文件系统存储特点:

    也称为HEAP存储引擎,所以数据保存在内存中。

    功能特点:

        支持HASH索引和BTree索引

        HASH索引适合等值查找

        BTree索引适合范围查找

        所有字段都为固定长度 varchar(10)= char(10)

        不支持BLOG和TEXT等大字段

        Memory存储引擎使用表级锁

        最大大小由max_heap_table_size参数决定

    容易混淆的概念:

        Memory存储引擎表:

        临时表:

        系统使用临时表:

        超过限制使用Myisam临时表

        未超限制使用Memory表

        create temporary table 建立的临时表:

    使用场景:

        用于查找或者是映射表,例如邮编和地区的对应表

        用于保存数据分析中产生的中间表

        用于缓存周期性聚合数据的结果表

    10.MySQL常用存储引擎之Federated

    特点:

        提供了访问远程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:映射的表的名字

    使用场景:

        偶尔的统计分析及手工查询

    11.如何选择正确的存储引擎

    参考条件:

        事务

        备份

        崩溃恢复

        存储引擎的特有特性

    12.MySQL服务器参数

    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_by

    相关文章

      网友评论

          本文标题:究竟是什么影响了MySQL的性能

          本文链接:https://www.haomeiwen.com/subject/lywdkqtx.html