[Linux]Day31-20180608【MySQL体系结构】

```
【本节主题:MySQL体系结构】

回顾:
多表查询
1、内连接
多表横向连接,并且设置过滤条件
2、左外连接
多表横向连接
3、右外连接
多表横向连接
4、完全外连接
左外连接 union 右外连接
5、???
完全外连接,并且过滤去掉交集

表与表之间的关系
1、一对一
2、一对多
3、多对多
建立第三张表,当作外键表,其他两张表当作主键表

MySQL权限管理
管理类权限
建数据库、建表
程序类权限
函数、存储过程、触发器
数据库和表级别
权限传递(慎用)
数据操作
增删改查
字段级别
所有权限
ALL

GRANT授权
priv_level:授权等级
. :任意资源(任意数据库的任意表)
routine_name
授权的同时顺带创建用户账户

-- 
create user wang@'192.168.30.%' identified by 'centos';
-- 
grant all on hellodb.* to wang@'192.168.%.%' identified by 'magedu';

注意:
(1)创建了两个同名用户wang,但是两个用户的权限范围不同;
(2)wang用户使用小权限的登录口令远程登录时,可以获得大权限范围的权限。

-- 授权指定操作
grant select,insert on hellodb.* to mage@'%' identified by 'centos';
-- 针对特定的字段进行授权
grant select(stuid,name) on hellodb.students to zhang@'%' identified by 'centos';
-- 
show grant for current_user();

REVOKE取消授权

-- 取消授权指定操作
revoke delete on hellodb.* from wang@'192.168.%.%';

系统数据库mysql
列授权
表授权
存储过程授权

flush privileges:刷新授权表(包括用户帐号和用户授权)

MySQL体系结构
连接管理模块
线程管理模块
连接线程池
用户模块
命令分发器
执行指令
缓存查询结果:重要!
日志记录模块
增删改操作必须有日志记录
事务日志
数据库启动日志
数据库错误日志
命令解析器
查询优化器
表变更模块
表维护模块
复制模块
状态模块
访问控制模块
表管理模块
存储引擎接口
表结构:影响数据在磁盘上的存储形式

存储引擎
MyISAM:MySQL5.5.5及更老版本
适用于“读多写少”或“只读”的小型数据库
InnoDB:
Percona-XtraDB:

Storage limit 存储大小限制
Transactions 事务:支持撤销(row-back)
Locking granularity 锁级别:限制多用户并发访问时对同个数据库资源的访问
    MyISAM是基于表的锁;InnoDB是基于行的锁
    锁的粒度:InnoDB更精细
MVCC多版本并发访问控制:
    事务版本号(事务编号)
    create_version
    delete_version
    事务具有隔离性,?????
Full-text search indexs 全文索引
Clustered indexes 聚簇索引、聚集索引
Data caches 数据缓存
Foreign key support 外键

注意事项:
存储引擎与表相关,与库无关
强烈不建议在同一个数据库中的多个表使用不同的存储引擎!!!

innodb_file_per_table 分库分表

没有特殊要求的,默认使用InnoDB
但是!新建的数据库默认不会分库分表!!!

官方解释:5.6及更高版本默认启用

-- 可以查看当前版本是否开启“分库分表”功能
show variable like 'innodb_file%';

可以通过修改配置文件实现“分库分表”功能
vim /etc/my.cnf

[mysqld]
innodb_file_per_table=ON

BLACKHOLE “黑洞”存储引擎
承接主服务器的推送,并且转发至其他从服务器

设置默认的存储引擎
vim /etc/my.cnf

[mysqld]
default_storage_engine=InnoDB;

变量与选项
服务器选项
系统变量
Dynamic:变量动态修改
环境变量

变量的生效返回
Session:会话范围有效
Global:全局范围有效
Both
Status:只读的状态变量

skip-name-resolve:阻止IP反向解析成FQDN
innodb_file_per_table:分库分表

SET 用于设置变量
带global就是全局级
不带global就是会话级

-- 
show global variables;
-- 
show variables like 'sql_log_bin';
-- 
set sql_log_bin=false;

global变量:433
session变量:419

服务器变量 SQL_MODE

-- 
show warnings;
-- 采用传统模式
set sql_mode='traditional';

MySQL架构(用户视角)
Connectors连接器
Connection Pool 连接池
开启新线程为用户连接提供服务
线程复用:连接断开时清空线程数据
并发连接数:仅两百多,是造成网站性能瓶颈的最主要原因
SQL Interface 检查语句语法
Parser 对象特权检查
是否具有操作对象的特权
Optimizer 优化
访问路径:选择最佳路径
Caches & Buffers 缓存缓冲
Pluggable Storage Engines 插件式存储引擎
File system 文件系统访问
存储引擎默认块大小:16K
存储引擎读写数据的最小单位:16K
Files & Logs 文件日志
Managerment Services & Utilities 管理工具

查询的执行路径
Query Cache 查询缓存
基于hash值
本次的SQL语句必须与上一次SQL语句一模一样,区分大小写
SQL_NO_CACHE 不缓存
now()函数返回值:当前系统时间
QUERY_CACHE_LIMIT
SQUERY_TYPE_TYPE 是否开启缓存
默认是 ON或1 ,默认开启缓存

优化查询缓存
命中率

索引
聚簇索引、主键索引
最终的数据放在叶子节点上
键和数据存放在一起
以主键数据做排序,这决定了主键只能有一个
举例:书的目录
非聚簇索引、二级索引
通过指针找到主键
索引指向主键,索引与数据分离
举例:书后面的附录
MyISAM不支持聚集索引
.frm :表结构
.MYD :数据文件
.MYI :索引文件

稠密索引
    索引存放顺序是连续的
稀疏索引
    索引存放顺序是不连续的

B+Tree
    按照一定的次序来排序
    适合通过一定范围来搜索
Hash索引
    仅适合精确匹配

索引工作方式
单一索引
复合索引
不能把复合索引的第二列直接作为过滤条件
必须使用第一列来搜索查找
可以按照某个值开头来匹配
经常查询的列往左侧放(靠前)
B+Tree索引限制
排序时不能跳过中间列
复合索引优化建议
不要出现NULL值
使用短索引
建议使用连接代替子查询

-- 
show indexes from students\G
-- 看到的执行过程:全表扫描
explain select * from students where Age > 20;
-- 创建单列索引
create index index_age on students(age);
-- 
show index_statistics;

EXPLAN解析命令执行过程
id :判断有多少条select语句
select_type
SUBQUERY
DERIVED

Transaction事务
完整事务:redo
不完整事务:undo

事务周期

```

猜你喜欢

转载自www.cnblogs.com/linyongfeng/p/9179521.html