0%

MySQL学习笔记-什么影响了MySQL性能

服务器硬件

CPU资源

  • Web应用-Core重于频率

内存大小

  • 主板支持最大频率的内存

网络

IO子系统

  • 传统硬盘

    • 存储容量
    • 传输速度
    • 访问时间
    • 主轴转速
    • 物理尺寸
  • RAID

    • RAID0

      • 多个独立磁盘串行
      • 最简单
      • 性价比最高
      • 数据没有冗余
    • RAID1

      • 磁盘镜像
      • 安全性最高
    • RAID5

      • 分布式奇偶校验磁盘阵列
    • RAID10

      • 分片镜像
  • 固态存储

    • 更好的随机读写性能

    • 更好的支持并发

    • 更容易损坏

    • 使用场景

      • 大量随机I/O场景
      • 单线程负载I/O瓶颈
  • 网络存储

    • SAN

      • 大量顺序读写
    • NAS

      • 有一定网络延迟
    • 适合数据库备份

网络性能的限制

  • 延迟
  • 带宽
  • 网络质量影响

操作系统

CentOS

  • 内核相关参数(/etc/sysctl.conf)

    • 网络参数

      • net.core.somaxconn=65535 #监听队列长度
      • net.core.netdev_max_backlog=65535
      • net.ipv4.tcp_max_syn_backlog=65535
      • net.ipv4.tcp_fin_timeout =10
      • net.ipv4.tcp_tw_reuse =1
      • net.ipv4.tcp_tw_recycle =1
      • net.core.wmem_default = 87380
      • net.core.wmem_max = 16777216
      • net.core.rmem_default = 87380
      • net.core.rmem_max = 16777216
      • net.ipv4.tcp_keepalive_time =120
      • net.ipv4.tcp_keepalive_intvl =30
      • net.ipv4.tcp_keepalive_probes =3
    • 内核参数

      • kernel.shmmax=4294967295

        • Linux内核参数中最重要的参数之一,用于定义单个共享内存段的最大值

        • 注意事项

          • 这个参数应该设置的足够大,以便能在一个共享内存段下容纳下整个的Innodb缓冲池的大小
          • 这个值的大小对于64位Linux系统,可取的最大值为物理内存值-1byte,建议设置为大于物理内存的一半,一般取值大于Innodb缓冲池的大小即可。
      • vm.swappiness = 0

        • 当内存不足时会对性能产生比较明显的影响

        • 如果完全禁用Swap

          • 降低操作系统性能
          • 容易造成内存溢出,崩溃,或都被操作系统Kill
        • 结论

          • 需要保留交换分区,但是要控制何时使用交换分区
        • 为0

          • 除非内存使用满了,否则不要使用交换分区
  • 增加资源限制(/etc/security/limit.conf)

    • * soft nofile 65535

    • * hard nofile 65535

    • 解释

      • * 所有用户有效
      • soft指的是当前系统生效的配置
      • hard表明系统中所能设定的最大值
      • nofile表示所限制的资源师打开文件的最大数目
      • 65535 限制的数量
    • 结论:把可以打开的文件数量增加到65535个以保证可以打开足够多的文件句柄

    • 注意:这个文件的修改需要重启系统才可以生效

  • 磁盘调度策略(/sys/block/devname/queue/scheduler)

    • noop

      • 电梯式调度策略(适合闪存,RAM,嵌入式系统)
    • cfq

      • 完全公平队列(默认,不适合MySQL)
    • deadline

      • 截止时间调度策略(适合数据库)
    • anticipatory

      • 预料I/O调度测量(适合写入较多的环境,比如文件服务器,不适合数据库)
    • 修改方法

      • echo deadlin > /sys/block/sda/queue/scheduler
  • 文件系统影响

    • Linux

      • 推荐使用XFS

      • EXT3/4

        • 系统挂载参数(/etc/fstab)

          • data = writeback | ordered | journal

            • Innodb适用于writeback,ordered较慢,journal最慢,最安全
          • noatime,nodiratime

            • 禁用相关时间
          • 示例:

            • /dev/sda1/ext3 noatime,nodiratime,data=writeback 1 1

数据库存储引擎的选择

MyISAM

  • MySQL5.5之前的默认存储引擎

  • 存储为MYD,MYI两个文件

  • 特性

    • 并发性与锁级别

      • 表锁
    • 表损坏修复

      • check table tablename
      • repire table tablename
    • 支持索引类型

      • 全文索引
      • Text等前缀索引
    • 支持数据压缩

      • myisampack
      • 只读
  • 限制

    • 单表<256T
  • 适用场景

    • 非事务型应用

    • 只读类应用(支持压缩)

    • 空间类应用

      • 支持空间函数

Innodb

  • 使用表空间进行数据存储

    • innodb_file_per_table

      • ON:独立表空间:tablename.ibd
      • OFF:系统表空间:ibdataX
    • 比较

      • 系统表空间无法简单的收缩文件大小
      • 独立表空间可以通过optimize table命令收缩系统文件
      • 系统表空间会产生I/O瓶颈
      • 独立表空间可以同时向多个文件刷新数据
    • 建议

      • 对Innodb使用独立表空间
  • 系统表空间

    • Innodb数据字典信息
    • Undo回滚段
  • 特性

    • Innodb是一种事务性的存储引擎
    • 完全支持事务的ACID特性
    • Redo Log和Undo Log
    • 支持行级锁
    • 行级锁可以最大程度支持并发
    • 行级锁是由存储引擎层实现的
  • 什么是锁

    • 锁主要作用是管理共享资源的并发访问

    • 锁用于实现事务的隔离性

    • 锁的类型

      • 共享锁(读锁)
      • 独占锁(写锁)
    • 锁的粒度

      • 表级锁
      • 行级锁
    • 阻塞和死锁

  • Innodb状态检查

    • show engine innodb status
  • 适用场景

    • 使用大多数OLTP应用

CSV

  • 文件系统存储特点

    • 数据以文本方式存储在文件中
    • .csv文件存储表内容
    • CSM文件存储表的元数据如表的状态和数据量
    • frm文件存储表结构信息
  • 特点

    • 以CSV格式进行数据存储

    • 所有列必须都是不能为null的

    • 不支持索引

      • 不适合大表
    • 可以对数据文件直接进行编辑

      • 保存文本文件内容
  • 适用场景

    • 适合作为数据交换的中间表

Archive

  • 文件存储特点

    • 以Zlib对表数据进行压缩,磁盘I/O更少
    • 数据存储在ARZ为后缀的文件中
    • 只支持Insert和select操作
    • 只允许在自增ID列上加索引
  • 适用场景

    • 日志和数据采集类应用

Memory

  • 文件系统特点

    • 也称为HEAP存储引擎,数据保存在内存中
  • 功能特点

    • 支持HASH索引和BTree索引

      • HASH适合等值
      • BTree适合范围
    • 所有字段都为固定长度

    • 不支持Blog和Text等大字段

    • 使用表级锁

    • 最大大小由max_heap_table_size参数决定

      • 默认16M
  • 容易混淆的概念

    • Memory存储引擎表

    • 临时表

      • 系统使用临时表

        • 超过限制使用MyISAM临时表
        • 未超过限制使用Memory表
      • create temporary table 建立的临时表

  • 适用场景

    • 用于查找或者映射表
    • 用于保存数据分析过程中产生的中间表
    • 用于缓存周期性聚合数据的结果表
    • MEMory数据容易丢失,所以要求数据可再生

Federated

  • 特点

    • 提供了访问MySQL服务器上表的方法
    • 本地不存储数据,数据全部存放到远程服务器上
    • 本地需要保存表结构和服务器连接信息
  • 如何使用

    • 默认禁止,启用需要在启动时增加federated参数
  • 适用场景

    • 偶尔统计分析以及手工查询

如何选择正确的存储引擎

  • 一般选择InnoDB

  • 参考条件

    • 事务
    • 备份
    • 崩溃恢复
    • 存储引擎的特有特性
  • 尽量不要混合使用存储引擎

数据库参数配置

MySQL获取配置信息路径

  • 命令行参数
  • 配置文件

MySQL配置参数的作用域

  • 全局参数

    • set global 参数名=参数值;
    • set @@global.参数名:=参数值;
  • 会话参数

    • set [session] 参数名=参数值
    • set @@session.参数名:=参数值

内存配置相关参数

  • 确定可以使用的内存的上限

  • 确定MySQL的每个连接使用的内存

    • sort_buffer_size
    • join_buffer_size
    • read_buffer_size
    • read_rnd_buffer_size
  • 确定需要为操作系统保留多少内存

  • 如何为缓存池分配内存

    • Innodb_buffer_pool_size

      • 总内存 -(每个线程所需要的内存*连接数)- 系统保留内存
    • key_buffer_size

      • 主要MyISAM使用

IO相关配置参数

  • Innodb I/O 相关配置

    • Innodb_log_file_size

    • Innodb_log_files_in_group

    • 事务日志总大小 = Innodb_log_file_size * Innodb_log_files_in_group

    • Innodb_log_buffer_size

    • Innodb_flush_log_at_trx_commit

      • 0:每秒进行一次log写入cache,并flush log到磁盘
      • 1:每次事务提交执行log写入cache,并flush log到磁盘
      • 2:每次事务提交,执行log数据写入到cache,每秒执行一次flush log到磁盘
    • Innodb_flush_method=O_DIRECT

      • 关闭操作系统缓存(Linux建议)
    • Innodb_file_per_table = 1

    • Innodb_doublewriter = 1

  • MyISAM

    • 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

    • 禁用Salve恢复
  • sql_mode

    • 设置MySQL所使用的SQL模式
    • strict_trans_tables
    • no_engine_subtitution
    • no_zero_date
    • no_zero_in_date
    • only_full_group_by

其他常用配置参数

  • sync_binlog

    • 控制MySQL如何向磁盘刷新binlog
  • tmp_table_size/max_heap_table_size

    • 控制内存临时表大小
  • max_connections

    • 控制允许的最大连接数

数据库结构设计和SQL语句

数据库设计对性能的影响

  • 过分的反范式化为表建立太多的列
  • 过分的范式化造成太多的表关联
  • OLTP环境中使用了不恰当的分区表
  • 使用外键保证数据的完整性

附Xmind

什么影响了MySQL性能