基于表 mysql5.5之后默认InnoDB
show create table tableName;
show engines;
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个页
三个文件:sdi表结构 myd数据文件 myi索引文件;日志类
数据存储在内存 支持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
select @@profiling;是否开启 set global|session profiling = 1;
show profiles;每一条sql耗时情况;
show profile for query query_id ; show profile cpu for query query_id ;
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 约束,便于优化器
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自动加
表空间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工作减少阻塞
原子/一致/持久/隔离--》 redo log undo log
redolog对数据页的物理修改,顺序磁盘io,redo log buffer内存,redo log磁盘中,循环使用
undolog原子性,被修改前的信息,逻辑日志
数据库隐式字段:
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:存储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日志
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
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设置隔离级别