首页   快速返回

mysql知识点整理     所属分类 mysql
MySQL的复制原理以及流程

3个线程
master  binlog线程 ,记录变更语句,写入binlog
slave   io线程,start slave 之后,负责从master拉取 binlog 内容,写入relay log
        sql执行线程 , 执行relay log中的sql 
       
myisam与innodb的区别

InnoDB支持事务,MyISAM不支持 
InnoDB支持行级锁,MyISAM支持表级锁
InnoDB支持MVCC, MyISAM不支持
InnoDB支持外键,MyISAM不支持
InnoDB不支持全文索引,MyISAM支持
MyISAM引擎的表在大量高并发的读写容易出现表损坏,其他容易损坏的场景 断点 强制关机

MyISAM存储了表中记录数,执行SELECT COUNT(*) from xxx 可以直接获取结果,InnoDB需要扫描全部数据后得到结果
MyISAM表存储为三个文件 表定义frm 数据文件MYD (MYData)  索引文件MYI (MYIndex)  
MyISAM表更省空间

表引擎类型查看 show create table xxx


innodb四大特点
insert buffer
Double write 
adaptive hash index 自适应哈希索引
read-ahead

varchar(50) 最多存放50个字符
varchar(50)和(200)存储hello所占空间一样,但后者在排序时会消耗更多内存,因为order by col采用fixed_length 计算col长度
int(20)   20表示最大显示宽度为20,但仍占4字节存储,存储范围不变
只是规定一些工具用来显示字符的个数,int(1)和int(20)存储和计算均一样


innodb日志种类

错误日志、查询日志、慢查询日志、事务日志、二进制日志、中继日志。


事务隔离级别
未提交读(Read uncommitted) 已提交读(Read committed) 可重复读(Repeatable read) 序列化(Serializable)
查看默认事务隔离级别
show global variables like 'tx_isolation'

事务实现原理

事务日志通过redo和innodb的存储引擎日志缓冲(Innodb log buffer)来实现
开始一个事务的时候,记录该事务的lsn(log sequence number)
事务执行时,往日志缓存里面写入事务日志
事务提交 日志缓冲区日志写入磁盘 通过innodb_flush_log_at_trx_commit来控制
写数据前,要先写日志 , 预写日志方式 WAL 
查看当前redo日志情况 show engine innodb status

Log sequence number 20499052099  当前的LSN
Log flushed up to   20499052099  表示刷新到redo log的LSN
Pages flushed up to 20499052099  表示刷新到磁盘的lsn
Last checkpoint at  20499052099  

cpu飙升处理

列出所有进程  show processlist, kill很久没有状态变化的
查看慢查询日志或错误日志

sql调优 explain

select_type 每个select子句的类型
type 在表中找到所需行的方式,又称 访问类型
possible_keys  可能使用哪些索引 ,但不一定被查询使用
key 查询中实际使用的索引,若没有使用索引,显示为NULL
key_len 索引中使用的字节数,可通过该列计算查询中使用的索引的长度
ref 表的连接匹配条件,即哪些列或常量被用于查找索引列上的值 
Extra 包含不适合在其他列中显示但十分重要的额外信息

profile的意义以及使用场景;
查询 SQL 会执行多少时间, 并看出 CPU/Memory 使用量, 执行过程中 System lock, Table lock 时间消耗等


数据备份 

mysqldump xtranbackup
备份恢复时间 参考
20G的2分钟(mysqldump)
80G的30分钟(mysqldump)
111G的30分钟(mysqldump)
288G的3小时(xtra)
3T的4小时(xtra)
逻辑导入时间一般是备份时间的5倍以上

快速启动大批量实例
puppet dsh

innodb的读写参数优化

读取参数
global buffer pool以及 local buffer;
写入参数;
innodb_flush_log_at_trx_commit
innodb_buffer_pool_size
与IO相关的参数;
innodb_write_io_threads = 8
innodb_read_io_threads = 8
innodb_thread_concurrency = 0
缓存参数以及缓存的适用场景。
query cache/query_cache_type



主从一致性校验工具
checksum、mysqldiff、pt-table-checksum

emoji表情支持 需要升级至utf8_mb4

InnoDB 基于索引来实现行锁
select * from xxx where id = 1 for update;
for update 根据条件来完成行锁锁定,并且 id 是有索引键的列,
如果 id 不是索引键 使用表锁

覆盖索引
如果一个索引包含(或覆盖)所有需要查询的字段的值,称为 覆盖索引 。即只需扫描索引而无须回表。


存储过程是一些预编译的SQL语句
模块化设计 复用 ,执行效率比较高, 降低网络流量,可以一定程度上保护数据安全

索引的作用
加快查询速度  where 条件  order by group by 字段
唯一索引 确保唯一

创建和维护索引 耗时 占用物理空间
增加、删除和修改数据 ,动态维护索引 ,降低性能

索引类型:唯一索引 主键索引 普通索引 全文索引 

聚簇索引和非聚簇索引
聚簇索引 按照数据存放的物理位置为顺序
聚簇索引能提高多行检索的速度,而非聚簇索引对于单行的检索很快

最左前缀

索引不会包含有NULL值的列
MySQL查询只使用一个索引
like '%xxx%' 不会使用索引 而like 'xxx%'可以使用索引
不要在索引列上使用函数或计算

事务(Transaction)
ACID 原子性(Atomicity) 一致性(Consistency) 隔离性(Isolation)持久性(Durability)


乐观锁和悲观锁

乐观锁 增加version字段 
 update xxx set c1='v1' ,version=version+1 where id=x and version=x

drop、delete与truncate的区别

delete和truncate只删除表数据不删除表结构
不再需要一张表的时候,用drop
删除部分数据,用delete,并且带上where子句
保留表而删除所有数据用truncate

视图 虚拟表
暴露部分字段
隐藏复杂的表关联 

数据库设计范式

第一范式(确保每列保持原子性)
   地址 拆分为省份、城市、详细地址等多个部分进行存储
第二范式(确保表中的每列都和主键相关)
第三范式(确保每列都和主键列直接相关,而不是间接相关)

上一篇     下一篇
投资人尽职调查要点整理

MySQL InnoDB的4个特性

jdk jcmd 使用

架构师需要具备的能力和素质

memcached知识点整理

A 股 的 真 相