您现在的位置是:首页 >技术教程 >MySQL索引事务(二)网站首页技术教程
MySQL索引事务(二)
1、索引
1.1、索引的分类
1.1.1、按数据结构分类:B+tree,Hash索引,Full-text索引。
InnoDB | MylSAM | Memmory | |
B+tree索引 | √ | √ | √ |
Hash索引 | × | × | × |
Full-text索引 | √(MySQl-version5.6.4) | √ | × |
B+tree索引是MySQL中被存储引擎采用最多的索引类型。它适用于全键值、键值范围和最左前缀查找。使用联合索引时,如果不是按照索引的顺序进行查找,则无法使用索引,除了适用于查找,还可以用于排序和分组。
1.1.2、按字段特性分分类:主键索引,唯一索引,全文索引,普通索引
主键索引(primary key)
*唯一标识,建立在竹简上的索引被称为主键索引,一张数据表只能有一个主键索引,索引列值不允许有空值,通常在创建表的时候一起创建。
*唯一索引(unique)
建立在unique字段上的索引被称为唯一索引,一张表可以有多个索引,索引列值可以允许为空,列值中出现多个空值不会发生重复冲突。
*普通索引(index)
建立在普通字段上的索引被称为普通索引。
*全文索引(fullText)
MylSAM存储引擎支持Full-text索引,用于查找文本中的关键字,而不是直接比较是否相等。Full-text索引一般使用倒排索引方式实现,它记录着关键词到其所在文档的映射。
1.1.3、按使用场景分类:聚集索引,非聚集索引
主键索引就是聚集索引,其他的都是非聚集索引
1.2、索引覆盖
MySQL执行计划explain结果里的key有使用索引,如果select后面查询字段都可以从这个索引的书中获取,这种情况一般可以说用到了索引覆盖,extra里一般都有using index;覆盖索引一般是对辅助索引,整个查询结果只能通过辅助索引才能你拿到结果,不需要通过辅助索引树就能找到主键,再通过主键取主键索引树里获取其它字段值。
1.2.1、索引覆盖是一种数据查询方式,不是索引类型。
1.2.2、回表查询
组合索引不包含所有数据,那么想要获取所有数据必须要回到主表进行查询,不会发生索引覆盖,这个现象叫做回表查询
select * from student where sn=xxx and name=xxx;
1.2.3、索引覆盖
通过索引过滤,而且查询的列只包含索引中的某些字段,不用再通过主键去主表里查询详细信息,这个现象就是索引覆盖
select sn,name from student where sn=xxx and name=xxx;
1.3、使用
*用explain查看执行计划
explain select * from student where xxx=xxx;
*使用普通索引的任何一个作为where条件
*索引的两列都作为where条件
2、事务
事务是指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败。在不同的环境中,都可以有事务。在数据库中,就是数据库事务
2.1、事务的特性
*原子性(Atomicity):数据库中最基本的一个特性,一组SQL要么执行要么全都不执行。
*一致性(Consistency):事务执行完成之后,保证数据的正确性。
*隔离性(Lsolation):多个事务之间毫不影响。
*持久性(Durability):事务一旦提交,就需要保存到磁盘中,不论是数据库坏了,还是其他原因,都不会影响数据的安全性
2.2、事务的隔离性和隔离级别
MySQL是一般部署在服务器上的,可以提供多个客户端连接并提供服务,多个客户端也都可以发送SQL到服务器执行,那么多个SQL之间就有可能产生影响,隔离级别就是为了解决多个SQL相互影响而产生的一系列规则。
*脏读 READ COMMITED
脏读并不是说数据不干净,只是说读到了不该读的数据
*不可重复读
把数据库的隔离级别提升了读已提交,解决了脏读问题。
*幻读
可重复读的隔离级别,是对事务加了一把锁,别的事务要想修改这些数据的时候是不被允许的但可以修改别的一些文件,比如说新增和删除
*序列化
数据库事务的最高级别。在此级别下,事务串行执行。可以避免脏读、不可重复读、幻读等读现象。但是效率低下,耗费数据库性能,不推荐使用。
脏读 | 不可重复读 | 幻读 | |
READ UNCOMMITED | √ | √ | √ |
READ COMMITED | × | √ | √ |
REPEATABLE READ | × | × | √ |
SERIALIZATION | × | × | × |
2.3、不同隔离级别的性能
2.4、事务的用法
1、开始事务
start transaction;
2、要执行的sql
3、commit;/rollback;
事务一旦提交之后就不能回滚。
4、查看MySQL的隔离级别
show variables like 'tx_isolation';