目录
一.索引
1.索引概念
2.查看索引
3.创建索引
4.索引使用的数据结构是什么
1.HASH(不是)
2.二叉搜索树(不是)
3.B树 N叉数(不是)
4.B+树(是滴)
5.组合索引
6.索引覆盖
7.回表查询
8.索引失效
二.事务
1.概念:
2.事务的使用
1.开启事务:start transaction;
2.执行多条SQL语句
3.回滚或者提交:rollback/commit;
以rollback为例:
3.事务的特性(ACID)
1.原子性
2.一致性
3.隔离性
4.持久性
4.事务的隔离级别
1.多个事务之间是否会相互影响
2.read uncommitted: 读未提交
3.read committed: 读已提交
4.repaeteble read 可重复读
5.隔离级别的总结
一.索引
1.索引概念
2.查看索引
show index from course;
3.创建索引
create index index_course_name on course(name);
4.索引使用的数据结构是什么
1.HASH(不是)
2.二叉搜索树(不是)
因为无法降低树的高度
3.B树 N叉数(不是)
4.B+树(是滴)
5.组合索引
针对WHERE
create index index_name_qqemail on student(name,qq_mail);
select * from student where name = '许仙' and qq_mail = 'xuxian@qq.com';
6.索引覆盖
select name,qq_mail from student where name = '许仙' and qq_mail = 'xuxian@qq.com';
7.回表查询
explain select name,qq_mail from student where name = '许仙' and qq_mail = 'xuxian@qq.com';
explain select * from student where qq_mail = 'xuxian@qq.com';
8.索引失效
二.事务
1.概念:
事务就是把一组SQL语句打包运行的机制
要么全部都执行成功,要么全都不执行
2.事务的使用
以下列表为例:
1.开启事务:start transaction;
2.执行多条SQL语句
3.回滚或者提交:rollback/commit;
rollback即全部失败 ,commit即全部成功
以rollback为例:
在事务还未回滚之前添加以及查询数据结果如下:
在事务还未回滚之后查询数据结果如下:
可以看到回滚后在事务中添加的数据并未运行成功
3.事务的特性(ACID)
1.原子性
2.一致性
3.隔离性
4.持久性
4.事务的隔离级别
1.多个事务之间是否会相互影响
2.read uncommitted: 读未提交
脏读是指用户第一次读到了事务没有提交的数据,当事务回滚之后,再次查询发现没有这条数据了
图例如下:
那么我们怎么解决这个问题呢?
答案就是加锁
但是写锁解决了脏读的问题,并不能解决重复读的问题
3.read committed: 读已提交
此时产生了新的问题,不可重复读
不可重复读是指在开启一个事务后,两个相同的查询结果出现了不同的现象
图例如下:
那么我们怎么解决这个问题呢?
答案还是加锁,不过这次加的是读锁
4.repaeteble read 可重复读
这样就解决了不可重复读的问题
图例如下:
serializable的隔离级别解决了这个问题,但随之而来性能也降到了最低
5.隔离级别的总结
说明:MySQL已经很好地解决了 repaeteble read 可重复读 隔离级别下产生的幻读问题,所以我们可以放心使用