数据库性能调优

数据库调优

1. MySQL数据库调优实践

1.1 MySQL数据库架构设计

核心架构模块

在这里插入图片描述

数据物理存放位置

  • 日志文件:一般存放路径/var/lib/mysql
  • 数据索引文件:一般存放日录/var/lib/mysql

常用日志文件

  • 错误日志:error log
  • 二进制日志:bin log
  • 通用査询日志:general query log
  • 慢查询日志:slow query log

在这里插入图片描述

1.2 SQL语句执行流程剖析

一条完整SQL语句执行流程:

一条SQL语句:

select c id,first name,last name from customer where c id=14;

Server层执行:连接器、查询缓存、分析器、优化器、执行器等

存储引擎层执行:负责数据的存储和提取

在这里插入图片描述

  1. 连接数据库:show processlist 显示所有连接进程。
  2. 査询缓存数据:show variables like ‘query cache type’;
  3. 分析SQL语句:语法分析、词法分析、预处理器
  4. 优化SQL语句:对查询进行语法调优
  5. 执行SQL语句:判断执行权限,然后调用存储引接口

查询缓存数据

MySQL拿到一个查询请求后,会先到查询缓存看看,之前是不是执行过这条语句之前执行过的语句及其结果可能会以 key-value 对的形式,被直接缓存在内存中。key 是查询的语句hash之后的值,value 是查询的结果。

1)查看是否开启缓存

mysql>show variables like ‘query cache type’;

2)查看缓存的命中次数:

mysql> show status like ‘qcache hits’,

3)开启缓存

在/etc/my.cnf文件中修改“query_cache_type”参数值为0或OFF会禁止使用缓存。

值为1或ON将启用缓存,但以SQ!拿到个查询信息层的语句除外。

值为2或DEMAND时,只缓存以SELECTSQL CACHE开头的语句。

修改配置文件my.cnf,在文件中增加如下内容开启缓存:query cache type=1

SQL语句如何解析

分析前SQL语句: select c_id,first name,last name from customer where c id=14;分析后关键字分隔:select,c_id,first name,last name,from,customer,where c_id,=,14

预处理器
进一步检查解析树是否合法,例如表名是否存在,语句中查询的列是否存在等

在这里插入图片描述

执行SQL语句

判断执行权限

调用存储引擎接口进行查询

在这里插入图片描述

1.3 MySQL存储引擎

MyISAM:高速引擎,拥有较高的插入,查询速度,但不支持事务
InnoDB:5.5版本后MySQL的默认数据库存储引擎,支持事务和行级锁,比MyISAM处理速度稍慢
ISAM:MyISAM的前身,MySQL5.0以后不再默认安装
MRG MYISAM:将多个表联合成一个表使用,在超大规模数据存储时很有用
Memory:内存存储引擎,拥有极高的插入,更新和查询效率。但是会占用和数据量成正比的内存空间。只在内存上保存数据,意味着数据可能会丢失
Archive:将数据压缩后进行存储,非常适合存储大量的独立的作为历史记录的数据,但是只能进行插入和查询操作
CSV:CSV存储引擎是基于CSV格式文件存储数据(应用于跨平台的数据交换)
在这里插入图片描述

InnoDB内存结构

在这里插入图片描述

在这里插入图片描述

1.3.1 innoDB 内存结构
  • InnoDB 内存结构主要分为如下四个区域:
  • Buffer Pool 缓冲池
  • Change Buffer 修改缓冲
  • Adaptive HashIndex 自适应索引
  • Log Buffer 日志缓冲

(1)缓冲池

  • 缓冲池Buffer Pool用于加速数据的访问和修改,通过将热点数据缓存在内存的方法最大限度限度地减少磁盘IO,加速热点数据读写。
  • 默认大小为128M,Buffer Pool中数据以页为存储单位,其实现的数据结构是以页为单位的单链表。
  • 由于内存的空间限制,Buffer Pool仅能容纳最热点的数据。
  • Buffer Pool 使用LRU算法(Least Recently Used 最近最少使用)淘汰非热点数据页。

​ LRU:根据页数据的历史访问来淘汰数据,如果数据最近被访问过,那么将来被访问的几率也更高,优先淘汰最近没有被访问到的数据。

  • 对于 Buffer Pool中数据的查询,InnoDB 直接读取返回。
  • 对于 Buffer Pool中数据的修改,InnoDB 直接在 Buffer Pool 中修改,并将修改写入redo log。

(2)修改缓冲(Change Buffer)
Change Buffer(在 MySQL 5.6 之前叫insert buffer,简称 ibuf)是InnoDB 5.5 引入的一种优化策略。Change Buffer(在MySQL5.6 之前叫 insert buffer,简称 ibuf)是InnoDB5.5 引入的一种优化策略。Change Buffer 用于加速非热点数据中二级索

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值