简介
mysql是一个关系弄数据库管理系统,是由瑞典mysql AB公司开发,2001年,集成存储引擎InnoDB,正式结合版本4.0;2003年5.0版发布,提供了视图、存储过程等功能;2008年被sun公司收购,2009年sun被oracle公司收购,于是后来就出现了MariaDB,且功能更加强大。
学习mysql基础点:
1、事务,隔离,并发控制,锁。2、用户及权限管理。3、监控。4、索引类型:查询。5、备份和恢复。6、复制功能。7、集群
mysql服务的构成 mysql数据
数据查询与存储:存储管理器,查询管理器
存储管理器:权限及完整性管理器,事务管理器,文件管理器,缓冲区管理器
查询管理器:DML解释器,DDL解释器,查询执行引擎
关系运算:投影,选择,自然连接,笛卡尔积,并
投影:只输出指定的属性
选择:只输出符合条件的行
自然连接:具有相同名字的属性上所有取值相同的行
笛卡尔积:(a+b)*(c+)=ac+ad+bc+bd
并:集合运算
宏观上,Mysql分为三层,而SQL层分了很多模块
- 用户模块的主要功能是用于控制用户登录连接的权限和用户的授权管理
- 命令分发模块-----客户端连接MySQL之后会发送一些语句,如果是查询命令,分发模块先将命令交给缓存模块处理,如果是是查看日志命令,则交给日志模块,其它命令交由分析器
- 分析器就是分析命令的语法语句来发给不同的模块
- 优化器要是将客户端发送的查询请求,在之前算法的基础上分析,计算出一个最优的查询策略,优化之后会提高查询访问的速度,最后根据其最优策略返回查询语句
- 表变更模块主要负责完成DML和DDL查询,如:insert、update、delete、create table、alter table 等语句的处理
- 表维护模块主要是用于检测表的状态,分析,优化表结构,以及修复表
- 表管理器:负责创建、读取或修改表定义文件;维护表描述符高速缓存;管理表锁
- 复制模块分为Master模块和Slave模块两部分。Master模块主要负责复制环境中读取Master端的binary日志,以及Slave端的I/O线程交互等工作。Slave模块主要有两个线程,一个负责从Master请求和接收binary日志,并写入本地I/O线程;另一个从relay log 读取日志事件,然后解析成可以在Slave端执行的命令,然后交给Slave端的SQL线程
- 存储引擎模块主要是将数据处理高度抽象化
mysql安装:专用软件安装包(rpm),二进制安装,源代码安装
mysql常见存储引擎:
MyISAM----不支持事务、也不支持外键,但其访问速度快,对事务完整性没有要求。每表三个文件 ,.frm表结构,.MYD表数据,.MYI表索引
InnoDB----提供了具有提交、回滚和崩溃恢复能力的事务安全。但是比起MyISAM存储引擎,InnoDB写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引。InnoDB所有表可共享一个表空间文件,也可一表一个表空间文件,建议选择后则,其设置选项innodb_file_per_table;InnoDB.frm表结构,.ibd表空间(表数据和表索引),.opt(存入的字符集和字符集排序规则)
在MariaDB中,XtraDB 替换 InnoDB,XtraDB 是 Percona 开发维护的 InnoDB 威力加强版,被设计用来更好的使用更新计算机硬件系统的性能,同时还包含有一些在高性能环境下的新特性。XtraDB 存储引擎是完全的向下兼容,在 MariaDB 中,XtraDB 存储引擎被标识为"ENGINE=InnoDB",这个与 InnoDB 是一样的,所以你可以直接用XtraDB 替换掉 InnoDB 而不会产生任何问题。Percona XtraDB 包含有所有 InnoDB's 健壮性,可依赖的 ACID 兼容设计和高级 MVCC 架构。XtraDB 在 InnoDB 的坚实基础上构建,使 XtraDB 具有更多的特性,更好调用,更多的参数指标和更多的扩展。从实践的角度来看,XtraDB 被设计用来在多核心的条件下更有效的使用内存和更加方便,更加可用。另外,Aria(原名Maria) 存储引擎----默认被编译进MariaDB 5.1里的,并且在mysqld启动的时候就要求同时启动,需要注意的时,内部的磁盘表是Aria表格式而不是MyISAM表格式,这将使某些GROUP BY
和DISTINCT
请求速度更快,因为Aria有比MyISAM更好的缓冲机制,包含Aria是MariaDB 5.1和MySQL 5.1之间的一个不同。
MSQL服务器变量
- 按作用域分,可以分为全局变量(SHOW GLOBAL VARIABLES)和会话变量(SHOW [SESSION] VARIABLES)
- 按生效时间,可以分为动态和静态的,动态可以即时修改;静态的是修改配置文件,另外还有种,通过参数传送的
SELECT @@GLOBAL.SQL_MODE; #查看服务器sql_mode,@@表示引的服务器变量,单个@是用户自定义变量
MYSQL事务及隔离级别
事务是访问并更新数据库中各种数据项的一个程序执行单元。在事务中的操作,要么都执行修改,要么都不执行,这就是事务的目的,也是事务模型区别于文件系统的重要特征之一。
show variables like 'autocommit'; #查看事务是否开启自动提交,默认开启
show variables like '%iso%'; #查看事务隔离级别
set session transaction isolation level read commint; #设置当前会话事务隔离级别为‘读已提交’
start transaction; #启动事务
commit; #提交
rollback; #事务回滚
savepoint id; #设置事务保存点
rollback to id; #回滚到保存点
事务的状态:活动的(active);部分提交的;失败的;中止的;提交的
四大特性----原子性、一致性、隔离性、持久性
原子性----事务必须是原子工作单元,对于数据的修改要么全都执行,要么不执行。
一致性----事务在完成时,必须使所有的数据都保持一致状态。这意味着所有相关的数据规则都必须应用于事务的修改,以保持数据的完整性;事务结束时,所有的内部数据结构(如B树索引或双向链表)也都必须是正确的。
隔离性-----数据库系统提供一定的隔离机制,保证事务在不受外部并发操作影响的“独立”环境执行。这意味着事务处理过程中的中间状态对外部是不可见的,反之亦然。
持久性-----事务完成之后,它对于数据的修改是永久性的,即使出现系统故障也能够保持。
锁:读锁、写锁;读锁是共享锁,写锁是独占锁。
- lock tables TB1 read; #手动给表添加锁,这里加的是读锁;如果一个会话在一个表上获得一个READ锁后,该会话和所有其他会话只能从表中读。不能往表中写,其它会话也可在该表获取一个READ锁,此时你会在show open tables里面看到in_use的值增加。其实LOCK TABLES READ是一个表锁,而且是共享锁。但是当一个会话获取一个表上的READ锁后,其它会话就不能获取该表的WRITE锁了,此时就会被阻塞,直到持有READ锁的会话释放READ锁。
- show open tables where in_use >=1;
锁粒度:从大到小,MYSQL服务器仅支持表级锁,行锁需要由存储引擎完成
表锁:开销小,加锁快;不会出现死锁;锁定力度大,发生锁冲突概率高,并发度最低
页锁:开销和加锁速度介于表锁和行锁之间;会出现死锁;锁定粒度介于表锁和行锁之间,并发度一般
行锁:开销大,加锁慢;会出现死锁;锁定粒度小,发生锁冲突的概率低,并发度高
show status like 'innodb_row_lock%'; #检查InnoDB_row_lock状态变量
隔离级别:未提交读(Read uncommitted)、已提交读(Read committed)、可以重复读(Repeatable read)、可以序列化(Serializable),其级别从低到高
show global variables like '%iso%'; #查看隔离级别
用户及权限管理
mysql库:
user表----用户名,密码,全局权限
db表----库级别权限
tables_priv----表级别权限
columns_priv----列级别权限
procs_priv----存储过程及存储函数相关权限
proxies_priv----代理用户相关权限