目录
什么是事务?
事务的ACID原则:
事务的操作
事务的原子性、一致性、持久性
事务的隔离性
什么是事务的隔离性?
用什么方法实现事务的隔离性?
MySQL中的锁
锁分类:
事务的隔离级别
事务并发问题
InnoDB的MVCC
MVCC的基本原理
MVCC的优点
MVCC的缺点
慢查询
Mysql对慢查询的操作
常见的函数分类
索引
索引的分类
全文索引注意:
优化原则——创建索引
优化原则-SQL编写
优化原则——索引失效
MySQL选择使⽤B+树⽽不是红⿊树作为其索引数据结构,主要是出于以下⼏个原因:
索引的物理分类
聚簇索引:
优点:
缺点:
⼆级索引(辅助索引、⾮聚簇索引) :
什么是事务?
事务(Transaction),就是将一组SQL语句放在同一批次执行,如果一个SQL语句出错,则该批次内的所有SQL都将被取消执行
特点:一个事务中如果有一个数据库操作失败,那么整个事务的所有数据库操作都会失败,数据库数据就会回滚到该事务开始之前的状态。
限制:MySQL数据库中仅InnoDB和BDB类型的数据库表支持事务
事务的ACID原则:
原子性:意味着数据库中的事务执行是作为原子粒度。即不可再分,整个语句要么执行,要么不执行
一致性:即在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏
隔离性:事务的执行是互不干扰的,一个事务不可能看到其他事务运行时,中间某一时刻的数据。
持久性:意味着在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。
事务的操作
1.关闭自动提交
set autocommit=0;
2.开始事务
start transaction;
3.一组sql语句
update bank set bmoney = bmoney-1000 where bname='周永康';
update bank set bmoney = bmoney+1000 where bname='杨文琦';
4.结束事务(判断)
-- 提交 提交一个事务给数据库。
commit;
-- 回滚 将事务回滚,数据回到本次事务的初始状态。
rollback;
5.开启自动提交
set autocommit=1;
事务的原子性、一致性、持久性
事务的原子性、一致性和持久性由事务的 redo 日志和undo 日志来保证。
• REDO LOG 称为 重做日志 ,提供再写入操作,恢复提交事务修改的页操作,用来保证事务的持久性。
• UNDO LOG 称为 回滚日志 ,回滚行记录到某个特定版本,用来保证事务的原子性、一致性。
事务的隔离性
什么是事务的隔离性?
为了让不同的事务之间相互不存在干扰,就需要对事务的操作进行隔离,
事务的隔离性也就是将操作同一个数据的事务相互分离,让操作之间分开有序的执行
用什么方法实现事务的隔离性?
通常用数据库里都是采用锁的机制,保证事物之间的隔离性
MySQL中的锁
锁分类:
基于锁的属性分类:共享锁(读锁、S锁)、排他锁(写锁,X锁)。
基于锁的粒度分类:表锁、行锁(记录锁、间隙锁、临键锁)。
基于锁的状态分类:意向共享锁、意向排它锁。
乐观锁和悲观锁
事务的隔离级别
事务并发问题
在事务并发执行的时候,如果不进行事务隔离,那么就会产生脏写、脏读、重复读、幻读的问题
事务的隔离级别
READ_UNCOMMITTED 读未提交 | 事务读取:不加锁 事务写入:加写锁 解决问题:脏写 存在问题:脏读,不可重复度,幻读 |
READ_COMMITTED 读提交(不可重复读) | 事务读取:加读锁(每次select完成后会释放读锁) 事务写入:加写锁 解决问题:脏写、脏读 存在问题:不可重复度,幻读 |
REPEATABLE_READ 可重复读 | 事务读取:加读锁(每次select完成后不会释放锁,而是事务结束后才释放)(如果是mysql的innodb还会加间隙锁) 事务写入:加写锁 解决问题:脏写、脏读,不可重复度,幻读(如果是mysql的innodb则已解决) 存在问题:幻读(如果是mysql的innodb则不存在) |
SERIALIZABLE 串行化 | 不管读取还是修改所有的事务串行化执行,一个事务的执行必须等其他事务结束。 |
InnoDB的MVCC
MVCC (Multiversion Concurrency Control),多版本并发控制。顾名思义,MVCC 是通过数据行的多个版本管理来实现数据库的并发控制 。这项技术使得在InnoDB的事务隔离级别下执行 一致性读操作有了保 证。换言之,就是为了查询一些正在被另一个事务更新的行,并且可以看到它们被更新之前的值,这样 在做查询的时候就不用等待另一个事务释放锁。
MVCC 的实现依赖于:隐藏字段、Undo Log、Read View。
InnoDB就是通过MVCC机制解决可重复读中的幻读问题。
MVCC的基本原理
MVCC的优点
MVCC的缺点
慢查询
Mysql默认10秒内没有响应SQL结果,则为慢查询
Mysql对慢查询的操作
//显示到mysql数据库的连接数
show status like 'connections';
-- 查看慢查询的状态
Show variables like '%slow_query%';
-- 设置慢查询的到表 mysql.slow_log
set global log_output='TABLE';
-- 设置慢查询的时间
set global long_query_time=3;
-- 开启慢查询
set global slow_query_log='ON';
-- 慢查询的次数
show status like 'slow_queries';
-- 慢查询记录
select * From mysql.slow_log ;
-- 慢查询sql语句
select convert(sql_text using utf8) sql_text from mysql.slow_log
-- 关闭慢查询
set global slow_query_log='OFF';
常见的函数分类
数学函数,聚合函数,字符串函数,日期函数和自定义函数
索引
索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息
特性:高效性,唯一性,完整性,特殊能力(使用优化隐藏器,提高系统性能)
索引的分类
主键索引:在数据库关系图中为表定义一个主键将自动创建主键索引。
唯一索引:不允许具有索引值相同的行,从而禁止重复的索引或键值。
常规索引:最基本的索引类型,没有 唯一性之类的限制。
全文索引:搜索引擎的关键技术,用于检索文本信息, 可以是词语或者段落。
全文索引注意:
1.Mysql 5.6之前版本,只有myisam支持全文索引,5.6之后,Innodb和myisam均支持全文索引。
2.只有char、varchar、text类型字段能创建全文索引。
3.当大量写入数据时,建议先写入数据,后再建立全文索引,提高效率。
4.Mysql内置ngram 解析器,可以解析中日韩三国文字。有汉字的一定要启用它。
5.英文分词用空格,逗号;中文分词用 ngram_token_size 设定.
注意需要在配置文件中加入:[mysqld]
ngram_token_size=2