day08-存储引擎

2019-06-27  本文已影响0人  藏鋒1013

一、回顾

1.1 索引

(1) 聚集索引构建B树的过程

(2) 辅助索引构建B树的过程

(3) 辅助索引细分

单列辅助索引
多列辅助索引*****
唯一索引
前缀索引

(4) 索引树高度问题

因素 解决方法
数据量级 分库、分表、分布式
数据类型 变长:char   定长:varchar
索引列值长度 前缀索引
enum 优化索引高度,能用则用

(5) explain(desc)重点回顾

你在你们公司做过哪些优化(MySQL)?

  1. 我在公司,主要是配合开发和业务人员,进行SQL优化和索引优化这块的工作
  2. 我主要针对索引优化这块儿,做的工作比较多
  3. 我一般都是配合两个数据库工具进行配优化
  4. 第一个就是slowlog(自动收集慢语句),第二个工具是explain
  5. 我通过之前做过的小案例来简单说明下我的优化思路
  6. explain(desc)使用场景(面试题)

1.2 存储引擎

(1) InnoDB存储引擎核心特性

1. 事务(Transaction)
2. MVCC(Multi‐Version Concurrency Control)多版本并发控制
3. 行级锁(Row‐level Lock)
4. ACSR(Auto Crash Safey Recovery)自动故障安全恢复
5. 支持热备份(Hot Backup)
6. 复制 Replication:Group Commit,GTID(Global Transaction ID),多线程(Multi‐
Threads‐SQL)

(2) 表空间管理

alter table t1 discard tablespace;
alter table t1 import tablespace;

(3) 事务特性

ACID

A:原子性
C:一致性
I:隔离性
D:持久行

(4) Redo在ACID中的作用

重做日志,前滚日志。
主要是完成ACID中的D(持久行)的特性,对AC也有一定的作用
存什么?
内存数据页变化的过程

(5) Undo在ACID中的作用

回滚日志,撤销日志。
主要完成的ACID中的A,对CI也有一定的作用

(6) Redo-CSR前滚

(7) Undo-CSR回滚

二、锁介绍

2.1 介绍

锁定的意思,提供的是ACID中I的功能,需要配合Undo+隔离级别一起来实现

2.2 InnoDB锁级别

行级锁
工作中(优化章节):需要排除锁的争用、锁等待、死锁

2.3 扩展内容

Next LOCK
GAP LOCK
悲观锁:
乐观锁:

三、事务的隔离级别

影响到数据的读取,默认的级别是RR级别
transaction_isolition隔离级别(参数)
负责的是,MVCC,读一致性问题

RU:读未提交,可脏读,一般部议述出现
RC:读已提交,可能出现幻读,可以防止脏读
RR:可重复度,功能是防止“幻读”现象,利用的是undo的快照技术+GAP(间隙锁)+Next LOCK(下键锁)
SR:可串行化,可以防止锁死,但是并发事务性能较差

RR级别:解决了不可重复读问题+幻读现象
不可重复读问题有undo的快照技术来解决
幻读现象是有:MVCC+GIS+Next-LOCK
补充:在RC级别下,可以减轻GAP+Next-LOCK锁的问题,但是会出现幻读现象,一般是为了读一致性会在正常select后添加for uqdate语句,但是,请记住执行完一定要commit 否则容易出现所等待比较严重。

四、InnoDB核心参数

4.1 双一标准之一:(*****)innodb_flush_log_at_trx_commit=1

1.作用:

控制了redo buffer 刷新策略,是一个安全参数,是在5.6版本以上默认的参数

2.参数功能:

1:每次事务提交,都会刷新redo到磁盘(redo buffer--每事务--->os buffer--每事务--磁盘)
0:表示当事务提交时,不立即做日志写入操作(redo buffer--每秒-->os buffer--每秒--磁盘)
2:每次事务提交引起写入文件系统缓存(redo buffer--每事务--->os buffer--每秒--磁盘)

4.2 Innodb_flush_method=(O_DIRECT,fdatasync)

1. 作用:

控制了redo buffer和data buffer刷写磁盘方式

2. 最大安全模式:

innodb_flush_log_at_trx_commit=1
innodb_flush_method=O_DIRECT

3. 最大性能模式:

innodb_flush_log_at_trx_commit=0
innodb_flush_method=fsync

4.3 关于redo设置

innodb_log_buffer_size=128M  业务系统CPU压力有关
innodb_log_file_size=256     一般是1~2倍
innodb_log_files_in_group=3  一般是3~4组

4.4 innodb_buffer_pool_size

生产一般调整为物理内存的50%~80%左右(你的系统中只有一个mysql实例)

面试题:

面试题简易回答:
请你简述InnoDB聚集索引和辅助索引的区别*****

1.一张表只能有一个聚集索引,最好是自增的数据列
2.聚集索引叶子节点是有序存储的整行数据
3.辅助索引一张表可以有多个
4.辅助索引叶子节点存储的是索引列的有序值+此列值的主键值
想要详细回答,整个两个索引构建的过程和配合使用买最好是画图说明

都是等值查询,建索引有什么好的建议?

1.考虑联合索引
2.排列问题?唯一值多放在
aler table t1 add idx(c,b,a)
select count(discard a) from t1;
为什么?
优化器会自动按照索引建立的顺序,自动排序 where条件见的顺序,前提是都是等值或者in的
如果出现了其他方式条件,比如:> 、<或者group by、order by

怎么判断联合索引将来的优化效果

1. 看执行计划
2. key_len

你在你们公司做过哪些优化(MySQL)?

1. 我在公司,主要是配合开发和业务人员,进行SQL优化和索引优化这块的工作
2. 我主要针对索引优化这块儿,做的工作比较多
3. 我一般都是配合两个数据库工具进行配优化
4. 第一个就是slowlog(自动收集慢语句),第二个工具是explain
5. 我通过之前做过的小案例来简单说明下我的优化思路
6.  explain(desc)使用场景(面试题)
     
     题目意思:我们公司业务慢,请你从数据库的角度分析原因
             1.mysql出现性能问题,我总结有两种情况:
               (1) 应急性的慢:突然夯住
                   应急情况:数据库hang(卡了,资源耗尽)        
                   处理过程:
                           1.show processlist;  获取到导致数据库hang的语句
                           2. explain 分析SQL的执行计划,有没有走索引,索引的类型情况
                           3. 建索引,改语句
              (2)一段时间慢(持续性的):
                  1.记录慢日志slowlog,分析slowlog
                  2.explain 分析SQL的执行计划,有没有走索引,索引的类型情况
                 3.建索引,改语句

7. 另外,我还做一部分存储引擎方面的优化。
我们有个业务是插入类的操作比较多,做过了一个存储引擎方面的优化。
将innoDB替换成了tokuDB 
主要说说为什么会使用tokudb 
上一篇下一篇

猜你喜欢

热点阅读