# DML 事务 隔离级别 存储引擎对比
##DML
insert into
第一种:
insert into tb_name [(col1,col2,....)]{values|value}(val1,val2,...)[,(val21,val22,....),....]
第二种:
insert into tb_name set col_name=val1,col2=val2,....
第三种(将一个表中的数据插入到另外一张表中):
insert into tb_name select clause
<!--replace的工作机制: 与Insert相同,除了在新插入的数据与表中的主键或唯一索引定义的数据相同会替换老的行;-->
update 更新数据
UPDATE [LOW_PRIORITY] [IGNORE] table_reference
SET col_name1=val1 [, col_name2={val2] ...
[WHERE where_condition]
[ORDER BY ...]
[LIMIT row_count]
update通常情况下,必须要使用where字句,或者使用limit限制要修改的行数
--safe-updates:启动时应该带选项
delete:删除数据
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name
[WHERE where_condition]
[ORDER BY ...]
[LIMIT row_count]
truncate tb_name ; 重置表的内容
##MYSQL基本架构
![](media/14612449206116/14612465920660.jpg)
连接池 与用户请求建立连接
连接连接池用到的协议:文本或者二进制
二进制的协议高效一些
核心功能层 查询解析,分析,优化,内置函数
跨存储引擎的功能
query cache 缓存,只保存select查询
存储引擎层 数据的存入和提取
**explain:分析语句,索引的使用**
##MySQL锁
执行操作时施加的锁的模式
1.读锁:用户在读的时候施加的锁,为防止别人修改,但是用户可以读,还被称为共享锁
2.写锁:独占锁,排它锁。其他用户不能读,不能写
锁粒度: (数据量)
表锁:table lock
锁定了整张表
行锁:row lock
锁定了需要的行
粒度越小,开销越大,但并发性越好:
粒度越大,开销越小,但并非性越差;
锁的实现位置:
MySQL锁:可以手动使用,可以使用显示锁
存储引擎锁:自动进行的(隐式锁)
显示锁:
lock tables:施加锁
LOCK TABLES
tbl_name lock_type
[, tbl_name lock_type] ...
锁的类型 lock_type
(READ | WRITE)
unlock tables:解锁
InnoDB存储引擎也支持另外一种显示锁(锁定挑选出的部分行,行级锁)
select .... lock in share mode
select .... for update
<!--做备份时要手动施加读锁-->
##事务:Transaction
事务就是一组原子性的查询语句,也即将多个查询当作一个独立的工作单元
ACID测试:能够满足ACID测试就表示其支持事务,或兼容事务
A:Atomicity,原子性,都执行或者都不执行
C:Consistency,一致性,从一个一致性状态转到另外一个一致性状态
I:Isolaction,隔离性。一个事务的所有修改操作在提交前对其他事务时不可见的
D: Durability, 持久性,一旦事务得到提交,其所做的修改会永久有效
安全性越高,并发性越低
隔离级别:
READ UNCOMMITTEND(读未提交),脏读,不可重复读,幻读
READ COMMITTEND(读提交) 不可重读
REPEATABLE READ (可重读)
SERIALIZABLE(可串行化)强制事务的串行执行避免了幻读;性能极低
启动事务
start transaction
事务提交
commit
事务回顾
rollback
savepoint 控制回滚的位置
SAVEPOINT identifier
ROLLBACK [WORK] TO [SAVEPOINT] identifier
**如何没有显式启动事务,每个语句都会当作一个默认的事务,其执行完成会被自动提交
1.select @@global.autocommit
set global autocommit = 0
2.cimmication:注意 关闭自动提交,请记得手动启动事务,应记得手动提交**
查看mysql的事务隔离级别
show global variables like ‘tx_isolation‘
select @@global.tx_isolation
设置mysql的事务隔离级别
set global tx_isolation= 级别 (READ UNCOMMITTEND| READ COMMITTEND| REPEATABLE READ | SERIALIZABLE
)
**建议:对事物要求不特别严格的场景下,可以使用读提交**
MVCC:多版本并发控制
每个事务启动时,InnoDB会为每个启动的事务提供一个当下时刻的快照
为实现此功能,InnoDB会为每个表提供两隐藏的字段,一个用于保存行的创建时间,一个用于保存行的失效时间,(其实里面存储的是系统版本号 system version number)
旨在两个隔离级别下有效:read committed和repeatable read
##MySQL 的存储引擎
定义:存储引擎也通常被称作“表类型”
查看存储引擎
mysql> show engines;
mysql> show table status [{FROM | IN} db_name] [LIKE ‘pattern‘ | WHERE expr]
比如 : mysql> show table status in hellodb;
mysql> show table status in hellodb where Name=‘class‘\G
***************************************
Name 表名
Engine 存储引擎
Version:版本
Row_format:行格式
{DEFAULT|DYNAMIC|FIXED|COMMPRESSED|REDUNDANT|COMPACT}
Rows:表中的行数
Avg_row_length:平均每行包含的字节数
Data_length:表中数据总体大小,单位为字节
Max_data_length:表能够占用的最大空间,单位为字节,0表示么有上限
Index_length:索引的大小,单位为字节
Data_free:对于MyISAM表,表示已经分配但尚未使用的空间,其中包含此前删除行之后腾出来的空间
Auto_increment:下一个AUTO_INCREMENT的值
Create_time:表的创建时间
Update_time: 表数据的最后一次修改时间
Check_time: 使用CHECK TABLE或myisamchk最近一次检查表的时间
Collation:排序规则
Checksum:如果启动,则为表的checksum
Create_options:创建表时指定使用的其他选项
Comment:表的注释信息
MySQL数据文件
InnoDB
1.innodb_file_per_table=OFF,即是用共享表空间
每个表一个独有的格式定义文件:tb_name.frm
还有一个默认位于数据目录下的共享的表空间文件:ibdata#
2.innodb_file_per_table=ON,即是用独立表空间
每个表在数据库目录下存储两个文件
tb_name.frm
tb_name.ibd
<!--表空间: table space ,由InnoDB管理的特有格式数据文件,内部可同时存储数据和索引-->
MyISAM
每个表都在数据库目录下存储三个文件
tb_name.frm
tb_name.MYD
tb_name.MYI
**修改默认存储引擎:通过default_storage_engine服务变量实现**
##各存储引擎的特性
InnoDB:
支持事务,有事务日志
ib_logfile0
ib_logfile1
支持外键约束
支持MVCC(多版本并发控制)
支持聚簇索引
聚簇索引之外的其他索引,通常称之为辅助索引
行级锁:间隙锁
支持使用辅助索引
支持自使用hash索引
支持热备份
MyISAM:
全文索引
支持表压缩存放:做数据仓库,能节约存储空间并提升性能
支持空间索引
表级锁
延迟更新索引
不支持事务、外键和行级锁
崩溃后无法安全恢复数据
使用场景:只读数据,表较小,能够忍受崩溃后的修复操作和数据丢失
ARCHIVE
仅支持INSERT和SELECT,支持很好压缩功能
应用于存储日志信息,或其他按照时间序列实现的数据采集类的应用
CSV:
将数据存储为CSV格式,不支持索引,仅使用与数据交换场景
BLACKHOLE:
没有存储机制,任何发往次引擎的数据都会丢弃,其会记录二进制日志,因此,常用于多级复制架构中作中转服务器
MEMORY:
保存数据在内存中,内存表;常用于保存中间数据,如周期性的聚合数据等,也用于实现临时表
支持hash索引,使用表级锁,不支持BLOB和TEXT数据类型
MRG_MYISAM:
是MYISAM的一个变种,能够将多个MyISAM表合并成一个虚表
NDB:
是MySQL CLUSTER中专用的存储引擎、
第三方的存储引擎
XtraDB:增强的InnoDB,有Percona提供
编译安装时,下载XtraDB的源码替代MySQL存储引擎中的InnoDB的源码
PBXT:MariaDB自带此存储引擎
支持引擎级别的复制、外键约束,对SSD磁盘提供适当支持
支持事务、MVCC
TokuDB:
使用 Fractal Trees索引,适用存储大数据,拥有很好的压缩比,已经被引入MariaDB
##列式数据存储引擎:
Infobright:目前较有名的列式引擎,适用于海量数据存储场景,如PB级别,专为数据分析和数据仓库设计
InfiniDB
MonetDB
LucidDB
##开源社区存储引擎:
Aria:前身为Maria,是增强版的MyISAM(支持崩溃后安全恢复,支持数据缓存)
Groona:全文索引引擎
Mroonga:是基于Groona的二次开发版
OQGraph:由open query研发,支持图(网状 )结构的存储引擎
SphinxSE:为Sphinx全文搜索服务器提供了SQL接口
Spider:能将数据切分成不同的分片,比较高效透明的实现了分片(shared),并支持在分片上支持并行查询
***如何选择存储引擎:
是否需要事务
备份的类型的支持
崩溃后的恢复
特有的特性***
##索引类型:
聚簇索引
辅助索引
B树索引
R树索引
hash索引
全文索引