MySQL性能优化 一、系统配置优化

数据库优化纬度有四个:

硬件升级、系统配置、表结构设计、SQL语句及索引。

优化选择:

  • 优化成本:硬件升级 > 系统配置 > 表结构设计 > SQL语句及索引
  • 优化效果:硬件升级 < 系统配置 < 标结果设计 < SQL语句及索引

1.保证从内存中读取数据

MySQL会在内存中保存一定的数据,通过LRU算法将不常访问的数据保存在硬盘文件中。

尽可能的扩大内存中的数量,将数据保存在内存中,从内存中读取数据,可以提升MySQL性能

扩大 innodb_buffer_pool_size,能够全然从内存中读取数据。最大限度降低磁盘操作。

确定 innodb_buffer_pool_size 足够大的方法:

sql 复制代码
show global status like 'innodb_buffer_pool_pages_%'

innodb_buffer_pool_size 默认为128M,理论上可以扩大到内存的3/4或4/5

修改my.cnf

innodb_buffer_size = 750M

如果是专用的MySQL Server 可以禁用SWAP

shell 复制代码
#查看swap
cat /proc/swaps

#关闭所有交换设备和文件
swapoff -a

2.数据预热

默认情况,仅仅有某条数据被读取一次,才会缓存在innodb_buffer_pool

所以,数据库刚刚启动,须要进行数据预热,将磁盘上的全部数据缓存到内存中

数据预热能够提高读取速度

1.对于InnoDB数据库,进行数据预热的脚本是:

sql 复制代码
SELECT DISTINCT
CONCAT('SELECT ',ndxcollist,' FROM ',db,'.',tb,
       ' ORDER BY ',ndxcollist,';') SelectQueryToLoadCache
FROM
(
  SELECT
  engine,table_schema db,table_name tb,
  index_name,GROUP_CONCAT(column_name ORDER BY seq_in_index)
  ndxcollist
  FROM
  (
    SELECT
    B.engine,A.table_schema,A.table_name,
    A.index_name,A.column_name,A.seq_in_index
    FROM
    information_schema.statistics A INNER JOIN
    (
      SELECT engine,table_schema,table_name
      FROM information_schema.tables WHERE
      engine='InnoDB'
    ) B USING (table_schema,table_name)
    WHERE B.table_schema NOT IN ('information_schema','mysql')
    ORDER BY table_schema,table_name,index_name,seq_in_index
  ) A
  GROUP BY table_schema,table_name,index_name
) AA
ORDER BY db,tb;

将该脚本保存为:loadtomem.sql

2.执行命令

shell 复制代码
mysql -uroot -proot -AN < /root/loadtomem.sql > /root/loadtomem.sql

3.在需要数据预热时,比如重启数据库

执行命令

shell 复制代码
mysql -uroot < /root/loadtomem.sql > /dev/null 2>&1

3.降低磁盘写入次数

  • 增大redolog,减少落盘次数
    • innodb_log_file_size 设置为 0.25*innodb_buffer_pool_size
  • 通用查询日志、慢查询日志可以不开,bin-log开
    • 生成中不开通用查询日志,遇到性能问题开慢查询日志
  • 写redolog策略 innodb_flush_log_at_trx_commit 设置为0或2
    • 如果不涉及非常高的安全性(金融系统),或者基础架构足够安全,或者事务都非常小,都能够用0或者2来减少磁盘操作

4.提高磁盘读写性能

使用SSD或者内存磁盘

相关推荐
宇宙无敌暴龙战士6662 分钟前
MySQL 8 库表操作学习笔记:SQL 基础、库表管理、约束与用户授权全流程
数据库·sql·mysql·学习笔记·后端开发
猿究院_夏燊10 分钟前
MySQL 的四种隔离级别
java·数据库·mysql
say_fall32 分钟前
【Linux系统编程】Ext 文件系统:磁盘与存储、文件与目录、现代计算机究竟如何寻找文件
linux·运维·服务器·数据库·c++
共享家95271 小时前
408 操作系统第一章
服务器·数据库·windows
这个DBA有点耶2 小时前
连拿六年第一后宣布出海:国产数据库凭什么敢撕掉“平替”的标签?
数据库·人工智能·架构
云和恩墨2 小时前
数据库监控简史:从会回答到能交付——AI-DBA如何成为真正的数字同事
数据库·人工智能·dba
paopaokaka_luck3 小时前
灾害应急物资管理系统(AI应急助手、Echarts可视化数据看板、捐赠入库联动、 物资全流程管理、库存变动追溯、灾情资讯与互动反馈、物资发放公示)
java·前端·javascript·spring boot·mysql·tomcat·echarts
这个DBA有点耶3 小时前
为什么删掉索引后,查询瞬间变快了?探讨MySQL的随机I/O与顺序I/O博弈
数据库·mysql·代码规范
kingx34 小时前
BugKu 渗透测试 4 实战:文件上传打点,5 Flag 全通
数据库·渗透测试·web·内网渗透
我命由我123454 小时前
Python 实用操作 - 文件操作(打开与关闭文件、读取文件、文件写入)
java·开发语言·前端·javascript·数据库·python·java-ee