MYSQL

存储引擎:

基于表 mysql5.5之后默认InnoDB

show create table tableName;

show engines;

innoDB: 事务/行级锁/外键

  xxx.ibd 表空间文件有表结构 数据 索引

 系统变量:innodb_file_per_table (ibd是单独还是一起放置)命令行 ibd2sdi 查看

 逻辑储存结构:tablespec表空间-->segment段--> extent区--> page页-->row行

     row:trx id 最后一次操作事务的id,roll pointer指针 col1列 

    page磁盘操作最小单元,extent=1M page=16K 64个页 

 MyISAM:表锁 访问快,不支持事务/行锁/外jian

    三个文件:sdi表结构 myd数据文件 myi索引文件;日志类

memory:

  数据存储在内存 支持hash索引,临时表/缓存,sdi文件:表结构数据

索引:存储引擎层

种类:

 b+tree常用的

 hash: memory,底层哈希表实现,精准匹配,不支持范围,不支持排序

 r-tree:空间索引,myisam用于地理空间数据类型

 full-text全文索引,倒排索引,快速匹配文档,innoDB5.6后支持,memory不支持

分类

 主键/唯一/常规/全文

聚集索引:数据与索引放一块,叶子结点存数据,主键索引/第一个唯一索引/自动生成rowid

二级索引:数据与索引分开,叶子关联对应主键,可多个

高度:

 一行数据=1k,一页存16行数据,指针6字节,主键一般是bigint占8字节

高度2: n*8+(n+1)*6=16*1024,n=1170 指针1171 ,1171*16=18736数据量

高度3: 1171*1171*16 =》2200w

性能优化

show golbal status like 'com_______';当前数据是以什么为主 增删改查

慢查询日志:

show variables like 'slow_query_log';

开启my.cnf :slow_query_log=1       long_query.time=2(s单位)  var/lib/mysql localhost_slow.log

profile

select @@profiling;是否开启  set global|session profiling = 1;

show profiles;每一条sql耗时情况;

show profile for query query_id ;          show profile cpu for query query_id ;

explain

id:序列号,多表id同依次执行,不同值越大越先执行

type:null  system  const唯一索引/主键  eq_ref    ref非唯一性索引   range  index遍历索引 all

key:实际用到的key;possible_key:可能用到的key

key_len 索引长度,rows执行查询的行数,filtered 返回结果行数占需读行数的百分比

最左前缀法则

最左列开头且不跳列(先后位置无关)

范围查询<> 右侧索引失效,推荐使用>= 或 =<

索引失效

索引列运算操作 / 字符串不加引号(隐形转换) / 头部模糊匹配/

or前后都有索引才会生效/评估索引慢则全表扫描/

select id,name,age from t_user use|ignore|force index(idx_user_name) where name = 'mx';

覆盖索引:查询返回的列都在索引中

using index condition使用到了索引,回表查询

using where,use index;都在索引中,不需要回表

前缀索引:字符串一部分前缀,建立索引 节省索引空间

 count(distinct substring(name,1,4)) /count(*) 

单列索引/联合索引

设计:

大数据量查询频繁 / where/order by/group by 出现的字段

区分度高的列,建立唯一索引  /  字符串类型较长,前缀索引

联合索引来使用覆盖索引避免回表,控制数量;索引不为null,notnull 约束,便于优化器

sql优化

insert:批量插入 500-1000;手动事务提交start transaction commit:主键顺序插入;

大批量load:开启 mysql --local-infile -u root -p ;开启set global local_infile =1;

load data local infile '' into table t_user fields terminated by ',' lines terminated by '\n';

页分裂(新增数据)/页合并(逻辑删除 merge_threshold)

降低主键长度/顺序插入,id自增/避免修改主键/不推荐uuid等

orderby

using filesort:通过表索引或全表扫,读取满足条件的行,缓冲区sort buffer排序

using index:索引顺序扫描返回有序数据;

增大sortbuffer大小=256k

limit:覆盖索引+子查询 

count:count(主键)遍历表id取出服务层累加。count(字段)有无not null约束 有则服务层累加,无服务层去掉null值累计。count(1)服务层按行累加。count(*)服务层直接累加

update:行锁给索引加的,索引失效 升级为表锁

视图:

检查 with check option 符合视图(含嵌套)规定否则报错

with local check option: 符合视图规定否则报错

更新:

  与基础表一一对应

  有聚合/窗口min count函数/distinct/group by /having/union/union all不支持更新

存储过程:sql的封装复用

触发器

flush tables with read lock;全局锁 数据备份 一致性

mysqldump --single-transaction -uroot -p1234 it_sku >itsku.sql;不加锁备份,利用快照

表级锁:lock tables table_name read|write;               unlock tables;

元数据锁:自动加

意向锁:

意向共享锁IS与表共享锁read共享 write互斥

意向排他锁IX:与表锁read write互斥

select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from performance_schema.data_lock; #查看意向锁及行锁的加锁情况

行级锁

间隙锁:数据的间隙        临键锁:记录+间隙 ( 幻读)

等值查询唯一索引时,不存在的记录加间隙锁

等值查询普通索引,右遍历时最后一个不满足需求,next-key lock间隙锁

lock in share mode;手动加,update自动加

innoDB引擎

表空间ibd文件,一个mysql实例可对应多个表空间,存储数据索引等

段:数据段b+树叶子节点 /索引段b+树非叶子节点 /回滚段 

区:表空间单元结构,1m 一区共有64个连续的页

页:引擎磁盘管理最小单元,16kb 每次申请4-5个区,页的连续性

行:trx_id最后一次操作事物id,roll_pointer执行前的数据情况

内存架构

  buffer pool:缓存经常操作的数据,一定频率刷新到磁盘,减少IO磁盘,dirty oage 被修改过

  change buffer更改缓冲区,非唯一二级索引页

 adaptive hash index自适应hash索引,优化对bufferpool数据查询,监控表上索引页的查询,自动优化,adaptive_hash_index

  log buffer日志缓冲区,log日志 redo undo 16m,定期刷新到磁盘,innodb_log_buffer_size,innodb_flush_log_at_trx_commit时机

磁盘结构

systemtablespace系统表空间

file-per-table tablespaces

general tablespaces:执行命令 create tablespace 

 undo tablespaces :

temporary tablespaces:

后台线程: 缓冲池刷新到磁盘

  master thread核心后台线程,调度其他线程,将缓冲池中数据异步到磁盘中,数据一致性,脏页刷新,合并插入缓存,undo页回收

  io thread在innodb中使用aio处理io请求,提供性能,4个读操作4个写操作1个日志缓冲区刷新到磁盘,1个写缓冲区刷新到磁盘

  purge thread回收事务已经提交了的undo log

  page cleaner thread协助mster thread刷新脏页到磁盘,减少mt工作减少阻塞

MYSQL_第1张图片

事务原理

原子/一致/持久/隔离--》 redo log  undo log

redolog对数据页的物理修改,顺序磁盘io,redo log buffer内存,redo log磁盘中,循环使用

undolog原子性,被修改前的信息,逻辑日志

mvcc:

数据库隐式字段:

   db_trx_id最后修改的事务;   db_row_id 隐式主键id 

  db_roll_ptr回滚指针,配合undolog 记录上一版本

undolog回滚日志

readview:

   m_ids活跃事物id,min_trx_id最小活跃事务id,max_trx_id预分配事务id,creator_trx_id事务所有者的id;

  rc 隔离级别下事务中每一次执行快照读都生产readview

 rr 事务中第一次执行快照读时生成readview,复用

read commited:事务中每一次执行快照读生成readview

MYSQL_第2张图片

系统库:

mysql:存储mysql服务器正常运行需要的各种信息,时区 主从 用户 权限

information_schema:提供了访问数据库元数据的各种表和视图,数据库 表字段类型访问权限

performance_schema:运行时状态提供了底层监控功能,收集数据库服务性能参数

sys方便dba和开发人员利用performance_schema性能数据库性能调优诊断视图

命令

mysqladmin 

mysqlbinlog 查看binlog日志文件/mysqlshow客户端查找工具

mysqldump:备份数据库或不同数据库间数据迁移

mysqlimport:导入工具,导入mysqldump -T导出的文件

source 导入sql文件  mysql内部命令行

日志

错误日志:

 show variables like '%log_error%' , 默认路径/var/log/mysqld.log

二进制日志

   binlog日志,记录ddl dml,数据恢复/mysql主从复制

   show variables like '%log_bin%'

日志格式binlog_format,修改my.cnf文件设置

   statement:sql语句本身

   row:每一行数据的变化,前后信息

   混合:

 删除:

 reset master删除全部

 purge master logs to 'binlog.***' 指定版本之前的log

 purge master logs before 'yyyy-mm-d d hh24:mi:ss' 指定日期前

 show variables like '%binlog_expire_logs_seconds%'配置文件自动过期时间s,30天

查询日志:

记录所有操作,show variables like '%general%'  修改配置文件/etc/my.cnf文件

   general_log=1 #开启 general_log_file=mysql_query.log设置名称

慢查询日志:

slow_query_log=1 #开启 my.cnf

long_query_time=2#执行时间参数 my.cnf

主从复制:

master 写 binlog日志

 mycat

io瓶颈:热点数据多,缓存不足,大量磁盘io,效率低 ;请求数据太多 带宽不够网络io

cpu瓶颈:排序 分组 连接查询 聚合统计 消耗cpu,请求数太多,cpu瓶颈

垂直拆分:以表为依据,业务不同拆分到不同

水平拆分:字段为依据,库的数据拆分到多个库中

shardingjdbc:aop原理,程序中对本地执行sql拦截,解析改写 路由配置,自行编码配置

mycat:数据库分库分表不调整代码

schema.xml:逻辑库/逻辑表/分片规则/分片节点/数据源

  schema逻辑库表

  dataNode数据节点 name datahost database

  datahost节点主机 数据源的balance负载均衡0 dbDriver驱动

rule.xml查分表的方法

分片

规则rule

范围分片:根据定义的范围分配到指定库中

取模mod-long:字段值与节点数量求膜运算,据结果决定数据属于哪个分片上

一致性hash:sharding-by-murmur 字段hash值

枚举sharding-by-intfile:省份/性别/状态

应用指定:据字符串(数字)计算分片号

固定分片hash算法:二进制位运算低10位 与 1111111111 位与&运算,同为1则是1,相同值可能分到相同分片

字符串hash解析:截取字符串中指定位置的子字符串,进行hash算法

监控:

原理:insert解析sql   (据字段)分片分析(规则)   路由分析  读写分离分析

     结果:合并  聚合/排序/分页处理

管理:server.xml 修改端口 8066DML DDL / 9066管理控制功能,集群状态

mycat-eye:监控mycat mysql

读写分离:

MYSQL_第3张图片

balance:

0不开启读写分离

1双主双从,readhost与备用writehost参与select负载均衡

2读写随机分配

3读随机分配到writehost对应的readhost上,writehost不执行读压力

双主双从:

两个主相互复制,一个master处理所有写,其他的负责读,当m1宕机,m2负责写

writeType:

0写操作转发到第一台writehost,writehost挂了切换到writehost2上

1写操作随机发送到配置的writehost上

switchType: -1不知道切换,1自动切换

权限

show grants for '用户名'@'主机';

grant all|alter|drop|select on database.* to ''@'';

revoke all on *.* from ''@'';

函数

concat字符串拼接

lpad(str,n,pad) 用pad左填充str,达到n个字符串长度

ceil()向上取整 floor()下取整  mod(a,b)x/y的模 =余数   rand() 0-1随机数 round(a,保留几位)

ifnull('','thanReturn');

union去重 与union all取所有结果,字段列数与类型一致

事务

脏读:一个事务读取到未提及的事务的数据

不可重复读: 一个事务读取到不同的同一条记录

幻读:一个事务按条件查询没有对应数据,插入数据时有发现了数据已经存在了

隔离级别:

read uncommitted:脏读   不可重复读   幻读

read committed:不可重复读   幻读

repeatable read:默认,幻读

serializable:

transation_isolation设置隔离级别

   

   

你可能感兴趣的:(mysql,数据库)