博客
关于我
MySQL 调优/优化的 101 个建议!
阅读量:794 次
发布时间:2023-02-11

本文共 1839 字,大约阅读时间需要 6 分钟。

MySQL 是一个强大的开源数据库,随着其应用越来越广泛,往往会遇到性能瓶颈。本文将提供 101 条 MySQL 优化建议,帮助你提升数据库性能。这些建议分为几个类别,便于你理解和应用。

MySQL 监控

  • 硬件和 OS 调优

    • 确保服务器有足够的物理内存,能够将 InnoDB 文件加载到内存中。
    • 避免使用交换(Swap),因为交换会从磁盘读取数据,速度较慢。
    • 使用电池供电的 RAM 来提高稳定性。
    • 采用高级磁盘阵列(如 RAID10 或更高)。
  • 磁盘配置

    • 避免使用 RAID5,因其校验开销较大。
    • 将操作系统和数据物理上分开,以减少 I/O 操作的开销。
    • 将临时文件和复制日志与数据文件分开。
    • 越多的磁盘空间,读写速度越快。
    • SAS 比 SATA 速度更快。
    • 小磁盘在 RAID 中速度优于大磁盘。
    • 使用电池供电的缓存 RAID 控制器。
  • ** OS 配置**:

    • 将 swappiness 设置为 0,避免数据库服务器使用交换空间。
    • 使用 noatime 和 nodirtime 选项挂载文件系统,减少不必要的时间更新。
    • 采用 XFS 文件系统,因其比 ext3 更快,且MySQL在 ext3 上存在双缓冲区问题。
    • 优化 XFS 的日志和缓冲区参数以获得最佳性能。
    • 使用 NOOP 或 DEADLINE IO 调度器,避免 CFQ 和 ANTICIPATORY 调度器的性能损失。
  • 系统优化

    • 使用 64 位操作系统,支持更大的内存寻址。
    • 清理服务器上的不必要程序和后台进程。
    • 将 MySQL server 和其他主机配置在同一 hosts 文件中,避免 DNS 查找。
  • 进程管理

    • 永远不要强制杀死 MySQL 进程,否则会导致数据库损坏。
    • 确保服务器只用于 MySQL,避免后台程序占用 CPU 资源。
  • MySQL 配置

  • InnoDB 配置

    • 设置 innodb_flush_method 为 O_DIRECT,避免双缓冲。
    • 避免同时使用 innodb_thread_concurrency 和 thread_concurrency。
  • 连接和性能

    • 设置 max_connections 为较小值,避免内存耗尽。
    • 保持 thread_cache 在较高值,减少连接建立时间。
    • 使用 skip-name-resolve,避免 DNS 查找。
    • 查询缓存适用于重复查询,但不适用于频繁变化的数据。
  • 存储引擎优化

    • 设置 temp_table_size 和 max_heap_table_size,避免磁盘写操作。
    • 避免将 sort_buffer_size 设置过高,防止内存耗尽。
    • 监控 key_read_requests 和 key_reads,确保 key_buffer 足够。
    • 设置 innodb_flush_log_at_trx_commit 为 0 可能提高性能,但默认值 1 保证数据完整性。
  • 测试和备份

    • 建立测试环境,便于配置验证和重启操作。
    • 临时禁用外键约束和唯一性检查,提高导入速度。
  • Schema 优化

  • 数据管理

    • 定期归档老数据,删除不必要的行。
    • 在数据上添加索引,但避免过度索引。
    • 压缩 text 和 blob 数据类型,减少磁盘读取。
  • 存储引擎选择

    • 使用 Archive 存储引擎存储日志表或审计表,因其写入效率高。
    • 将 session 数据存储在 memcache,减少 MySQL 的读写开销。
  • 数据类型和查询

    • 使用 VARCHAR 代替 CHAR,尤其是 UTF8。
    • 避免在列上添加多个索引,保持索引简单。
    • 使用 INSERT ON DUPLICATE KEY 或 INSERT IGNORE 代替 UPDATE。
    • 使用索引和 ORDER BY 代替 MAX 函数。
  • 查询优化

    • 使用慢查询日志和 EXPLAIN 工具分析慢查询。
    • 避免在整个表上使用 count(*),可能导致锁定。
    • 保持查询一致,方便缓存使用。
    • 使用 GROUP BY 代替 DISTINCT,适用于多个情况。
  • 备份过程

  • 备份策略

    • 在二级复制服务器上进行备份。
    • 停止数据复制以避免外键约束不一致。
    • 使用 mysqldump 时指定 -opt 参数。
    • 定期计算数据库和表的大小,监控增长。
  • 备份优化

    • 临时禁用外键约束和唯一性检查,提高导入速度。
    • 使用 cron 脚本监控主从复制的错误和延迟。
    • 定期备份数据,确保数据安全。
  • 推荐阅读

    长按关注,获取更多技术内容!

    转载地址:http://ddbfk.baihongyu.com/

    你可能感兴趣的文章
    Mysql 纵表转换为横表
    查看>>
    mysql 编译安装 window篇
    查看>>
    mysql 网络目录_联机目录数据库
    查看>>
    MySQL 聚簇索引&&二级索引&&辅助索引
    查看>>
    Mysql 脏页 脏读 脏数据
    查看>>
    mysql 自增id和UUID做主键性能分析,及最优方案
    查看>>
    Mysql 自定义函数
    查看>>
    mysql 行转列 列转行
    查看>>
    Mysql 表分区
    查看>>
    mysql 表的操作
    查看>>
    mysql 视图,视图更新删除
    查看>>
    MySQL 触发器
    查看>>
    mysql 让所有IP访问数据库
    查看>>
    mysql 记录的增删改查
    查看>>
    MySQL 设置数据库的隔离级别
    查看>>
    MySQL 证明为什么用limit时,offset很大会影响性能
    查看>>
    Mysql 语句操作索引SQL语句
    查看>>
    MySQL 误操作后数据恢复(update,delete忘加where条件)
    查看>>
    MySQL 调优/优化的 101 个建议!
    查看>>
    mysql 转义字符用法_MySql 转义字符的使用说明
    查看>>