进程间通信手段
- unix 域套接字,不需要tcp连接层和ip层
- 管道
- 消息队列
- 共享内存
mysql的进程间通讯
-
mysql的进程间通讯采用unix套接字的方式
-
在log文件目录下,有mysql.sock和mysql.sock.lock都是与通讯相关的文件
-
在linux操作系统下,每一个进程都有一个单独的PID,这个文件描述符被写在log目录下mysql.pid文件中
-
data文件目录
- 有好几个.pem文件,是rsa证书相关的密钥文件
mysql中的系统库
- performance_schema
- 性能相关,执行的语句、执行时间、花费的内存
- sys
- 数据来自performance_schema和information_schema
- 通过视图的方式展示出来
- information_schema
- 保存的mysql上维护的其他数据库的信息
- 比如自定义的数据库
- 也可以理解成mysql的元数据的数据库
- mysql
- 核心库
- 用户账户、权限信息、存储过程、事件的定义信息、一些过程产生的日志信息、时区相关信息
- 复制信息表
performance_schema库
-
除了在数据库里面可以看到(show database;),在存储引擎中也可以看到(show engines;)
-
表是非常多的,在5.7版本中,共有87张表
- 可以分类,比如event_statements就是记录的语句相关的信息,event_statements_summary表示是通过某种手段聚合的语句执行信息,介入的手段像账户、主机名、线程名等等
- event_stages,记录的语句执行过程中每一个阶段产生的事件
- event_transaction,是跟事务相关的
- file_xx,是跟mysql的文件系统相关的
- memory_xx,是跟mysql的内存使用相关的
- setup_xx,是用来配置当前性能监控表performance_schema相关的一些东西
-
性能监控首先是需要采集数据(收集各个指标)以及怎么存储数据这两个点
-
打开等待事件的采集器配置项开关,需要修改 setup_instruments 配置表中 对应的采集器配置项。 update setup_instruments set enabled=‘yes’,timed=‘yes’ where name like ‘wait%’
- 这个是负责采集的
-
打开等待事件的保存表配置项开关,修改 setup_consumers 配置表中对应的 配置项。 update setup_consumers set enabled=‘yes’ where name like ‘wait%’;
- 这个是负责存储的
-
怎么查看最近执行的错误sql语句
-
首先,我们模拟一条语法错误的 SQL 语句,使用events_statements_history_long 表或者 events_statements_history 表查询发生语 法错误的 SQL 语句
-
select * from events_statements_history where mysql_errno_1064\G
-
1064是执行语句报的错误信息中的错误码
-
通过执行这条语句可以把1064保存的sql执行情况全部找出来
-
其中sql语句一般写在SQL_TEXT,执行错误的信息放在MESSAGE_TEXT
-
-
-
mysql事务相关
- 事务的采集和存储
开启事务的配置
- 首先需要进行配置启用,事务事件默认并未启用
- update setup_instruments set enabled=‘yes’,timed=‘yes’ where name like ‘transaction%’;
- update setup_consumers set enabled=‘yes’ where name
事务相关
-
select * from events_transactions_current\G
- 查询当前活跃的事务
-
select * from events_transactions_history_long\G
- 可以查询到事务的执行历史,不管是回滚了,还是提交了
-
\G是转换了输出格式
sys库
-
专门为DBA服务
-
会需要权限
-
一次执行如下命令
- use sys;
- show tables like ‘%session’;
- 发现出现两张表session和xSession
- sys系统库下面每张表都有两份
- 展示的视图是成对出现的
-
可以查看慢sql具体慢在哪里
-
启用所有的 wait instruments:
CALL sys.ps_setup_enable_instrument(‘wait’);
-
启用所有事件类型的 current 表:
CALL sys.ps_setup_enable_consumer(‘current’);
-
执行相关sql语句
- select sleep(45); //休眠45秒
- select * from session where command=‘query’ and conn_id!=connection_id()\G; // 可以看到sql处于休眠状态
-
查询表的增、删、改、查数据量和 I/O 耗时统计
- select * from schema_table_statistics_with_buffer\G
-
information_schema库
- 元数据表
- 所有列相关的信息、所有索引相关的信息
mysql库
-
权限系统
-
有很重要的两个表,对表中的数据进行统计
-
innodb_index_stats
- innodb_index_stats 表提供查询与索引相关的统计信息
- select * from innodb_index_stats where table_name = ‘order_exp’;
- stat_name
- n_leaf_pages是叶子数量
- n_diff_pfx01是指示stat_description中对应列的数据去重后的数量
- n_diff_pfx02和n_diff_pfx03都类似于n_diff_pfx01,只是对应的列不同
- 所有建立的索引都有对应的stat_name下面的属性值,mysql会计算出所有索引的数据,即索引的唯一性数量,数据的离散型,来动态选择索引
- stat_name
-
innodb_table_stats
- innodb_table_stats 表提供查询与表数据相关的统计信息
- select * from innodb_table_stats where table_name = ‘order_exp’\G
- n_rows是估算的行数
- clustered_index_size是主键索引的大小,以页为单位
- sum_of_other_index_sizes是其他索引的大小,以页为单位
-
日志记录表–general_log
-
缺省不开启 show variables like ‘general_log’;
-
开启
- set global log_output=‘TABLE’;
- log_output='TABLE’表示普通查询日志同时写到表中
- log_output='TABLE,FILE’表示同时输出到表和文件
- set global general_log=on;
- show variables like ‘general_log’;
- set global log_output=‘TABLE’;
-
这种能不开就不要开,很影响性能
-
同样慢查询日志也可以写表或者写库
复制信息表
- 主从复制的过程中相关的记录表
bin_log和redo日志
- binlog
- 二期分库分表位置有讲
- 三种格式?
- redo日志跟事务相关,在第七章后面讲
数据库事务
- 事务是数据库管理系统(DBMS)执行过程中的一个逻辑单位(不可再进行分割),由一个有限的数据库操作序列构成(多个DML语句,select语句不包含事务),要不全部成功,要不全部不成功。
事务的四大特性
- 原子性(Atomicity)
- 一致性(Consistency)
- 持久性(Durability)
- 隔离性(Isolation)
事务并发会带来哪些问题?
- 脏读:当一个事务读取到了另外一个事务修改但未提交的数据
- 不可重复读:当事务内相同的记录被检索两次,且两次得到的结果不同时,此现象称为不可重复读(事务1查询某一条数据,事务2更新这条数据)
- 幻读:在事务执行过程中,另一个事务将新记录添加到正在读取的事务中时,会发生幻读(事务1查询某个条件下的数据,事务2新插入了一条这个条件的数据)
- 如果事务2是删除一条数据,sql92标准认为是幻读,mysql不认为是幻读,mysql强调是事务1读到之前没有读到的数据,而把这种情况认定为是不可重复读
SQL92标准中的隔离级别
-
隔离级别 脏读 不可重复读 幻读 READ UNCOMMITTED 未提交读 可能 可能 可能 READ COMMITTED已提交读 - 可能 可能 REPEATABLE READ可重复读 - - 可能 SERIALIZABLE 可串行化 - - -
MySQL中的隔离级别
-
隔离级别 脏读 不可重复读 幻读 READ UNCOMMITTED 未提交读 可能 可能 可能 READ COMMITTED已提交读 - 可能 可能 REPEATABLE READ可重复读 - - —— SERIALIZABLE 可串行化 - - - - mysql在可重复读情况下已经基本解决了幻读的问题
- 快照读(一致性读)通过mvcc解决,不会通过加锁解决
- 当前读(锁定读、LBCC【基于锁的并发控制、Locked_Base_Concurrent_Control】)通过间隙锁解决
- mysql在可重复读情况下已经基本解决了幻读的问题
MySQL事务
- 事务基本语法
- begin
- commit
- rollback
- 保存点(savepoint)
- 在存储过程中才用得到,一堆sql语句,某些产生异常的点进行保存,rollback到某一个点,而不是全部回滚
- save point 名字
- rollback to 名字
- 隐式提交
- 没有写commit也可能提交,比如执行DDL语句【data definition language】,比如Alter table
- 使用mysql库给某个用户授权,也会自动提交
- 在一个会话里面写了两个begin,之间的也会提交
- lock table也会把之前的sql语句提交
MySQL中表设计和数据类型优化
范式化设计
- 范式来自英文Normal Form,简称NF。要想设计—个好的关系,必须使关系满足一定的约束条件,此约束已经形成了规范,分成几个等级,一级比一级要求得严格。满足这些规范的数据库是简洁的、结构明晰的。
六种范式
-
第一范式(1NF) 第二范式(2NF) 第三范式(3NF) 巴斯-科德范式(BCNF) 第四范式(4NF) 第五范式(5NF,又称完美范式)
第一范式(1NF)
-
1、每一列属性都是不可再分的属性值,确保每一列的原子性; 2、两列的属性相近或相似或一样,尽量合并属性一样的列,确保不产生冗余数据; 3、单一属性的列为基本数据类型构成; 4、设计出来的表都是简单的二维表。
第二范式(2NF)
-
1、第二范式(2NF)是在第一范式(1NF)的基础上建立起来的。 2、第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系
第三范式(3NF)
-
1、满足第三范式(3NF)必须先满足第二范式(2NF); 2、第三范式(3NF)要求一个数据库表中不包含已在其它表中包含的非主关键字信息,即数据不能存在传递关系,即每个属性都跟主键有直接关系而不是间接关系。
范式补充说明
- 真正的数据库范式定义上,相当难懂,比如第二范式(2NF)的定义“若某关系R属于第一范式,且每一个非主属性完全函数依赖于任何一个候选码,则关系R属于第二范式。”。
- 针对范式内容,参考《数据库系统概论》第五版高等教育出版社
反范式化设计
反范式化设计是什么?
-
所谓的反范式化设计,就是针对范式化设计而言的。 1、为了性能和读取效率而适当的违反对数据库设计范式的要求; 2、为了查询的性能,允许存在部分(少量)冗余数据。换句话说,反范式化设计就是使用空间换时间。
实际工作中的反范式实现
范式化和反范式总结
-
性能提升-冗余、缓存和汇总 性能提升-计数器表 反范式设计-分库分表中的查询