目录
一、存储引擎
1、什么是存储引擎
2、怎么设存储引擎
3、常用存储引擎
MyISAM存储引擎
InnoDB存储引擎
MEMORY存储引擎
二、事务
1、什么是事务
2、怎么做到同时成功同时失败
3、怎么提交和回滚呢
4、事务4个特性
A:原子性
C:一致性
I:隔离性
D:持久性
5、事务的隔离级别
三、索引
1、什么是索引
2、索引实现原理
3、什么时候用索引
4、索引失效
第一种
第二种
第三种
第四种
第五种
一、存储引擎
1、什么是存储引擎
存储引擎就是一个表存储数据的方式,不同的存储引擎,存储数据的方式不同
2、怎么设存储引擎
可以在建表的时候,给表指定存储引擎(小括号的后面用 ENGINE 指定存储引擎)
mysql默认的存储引擎是 innoDB
3、常用存储引擎
MyISAM存储引擎
它管理的表具有以下特征:
使用三个文件表示每个表:
- 格式文件 - 存储表结构的定义 (mytable.frm)
- 数据文件 - 存储表行的内容 (mytable.MYD)
- 索引文件 - 存储表上索引 (mytable.MYI)InnoDB存储引擎
特点:
- 因为都存储在文件,可被转换为压缩、只读表来节省空间,这是这种存储引擎的优势!
- 不支持事务
InnoDB存储引擎
这是mysql默认的存储引擎,也是重量级的存储引擎,支持事务,支持数据库崩溃后自动恢复机制,特点是安全。
MEMORY存储引擎
内存存储引擎,且长度固定,所以特点是非常快,但是一断电就消失,数据和索引都存在内存
查询效率是最高的,但是不安全
二、事务
1、什么是事务
一个事务就是一个完整的业务逻辑
(比如转账,A向B转100,A账户减去100(update语句),B账户加100(update语句),这就是完整的业务逻辑)
上面的两个update语句必须同时成功或者同时失败
只有DML语句才和事务有关系,只有对数据进行增删改才要和事务有关系
2、怎么做到同时成功同时失败
InnoDB存储引擎: 提供一组用来记录事务性活动的日志文件事务开启了:
insert
insert
insert
delete
update
update
update事务结束了 !
在事务的执行过程中,每一条DMM的操作都会记录到“事务性活动的日志文件”中在事务的执行过程中,我们可以提交事务,也可以回滚事务。
提交事务?
清空事务性活动的日志文件,将数据全部彻底持久化到数据库表中提交事务标志着,事务的结束。并且是一种全部成功的结束。
回滚事务?
将之前所有的DM操作全部撤销,并且清空事务性活动的日志文件回滚事务标志着,事务的结束。并且是一种全部失败的结束。
3、怎么提交和回滚呢
提交事务:commit
回滚事务:rollback(回滚永远只能回滚到上一次的提交点)
mysql默认情况下支持事务自动提交,没执行一条DML语句,则提交一次!
这种自动提交实际上是不符合我们的开发要求的,因为业务通常需要多条DML同时执行才能完成,为了保证数据安全,必须同时成功或者同时失败,所以不能执行一条提交一条
怎么把自动提交关闭呢?
start transaction;
4、事务4个特性
A:原子性
说明事务是最小的工作单元,不可再分
C:一致性
同一个事务中,所有的操作必须同时成功或同时失败,保证数据的一致性
I:隔离性
A事务和B事务之间具有一定的隔离。A事务操作一张表的时候,B事务也操作这种表会怎么样
D:持久性
事务最终结束的一个保障,事务提交,就相当于将没有保存到硬盘上的数据保存到硬盘上
5、事务的隔离级别
- 读未提交(read uncommitted),指一个事务还没提交时,它做的变更就能被其他事务看到;事务A可以读取到事务B还没提交的数据,这种隔离级别就会存在脏读现象
- 读提交(read committed),指一个事务提交之后,它做的变更才能被其他事务看到;事务A只能读取到事务B提交后的数据,解决了脏读现象,存在不可重复读取数据(第一次读到的和第二次再读取的是不同的,第一次3条,第二次读到4条)
- 可重复读(repeatable read),指一个事务执行过程中看到的数据,一直跟这个事务启动时看到的数据是一致的,MySQL InnoDB 引擎的默认隔离级别;可能会出现幻读,每次读到的数据都是幻想,不够真实,永远读取到的都是刚开启事务时的数据,只要事务不结束,就一直是那个数据
- 序列化/串行化(serializable );会对记录加上读写锁,在多个事务对这条记录进行读写操作时,如果发生了读写冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行;事务只能一个个排队执行,不能并发,效率低
按隔离水平高低排序如下:
三、索引
1、什么是索引
在数据库表的字段上添加的,是为了提高查询效率存在的一种机制
一张表的一个字段可以添加一个索引,当然,多个字段联合起来也可以添加索引
索引相当于一本书的目录,是为了缩小扫描范围而存在的一种机制
2、索引实现原理
在任何数据库当中主键id自动添加索引对象,如果有unique约束的话,也会自动创建索引
在任何数据库当中,任何一张表的任何一条记录在硬盘存储上都有一个硬盘的物理存储编号。
在mysql当中,索引是一个单独的对象,不同的存储引擎以不同的形式存在,在MyISAM存储引擎中,索引存储在一个.MYI文件中。在InoDB存储引擎中索引存储在一个逻辑名称叫做tablespace的当中。在MEMORY存储引擎当中索引被存储在内存当中。不管索引存储在哪里,索引在mysql当中都是一个树的形式存在。(自平衡二又树: B-Tree)
3、什么时候用索引
在mysq1当中,主键上,以及unique字段上都会自动添加索引的!!!!
什么条件下,我们会考虑给字段添加索引呢?
- 条件1: 数据量庞大(到底有多么庞大算庞大,这个需要测试,因为每一个硬件环境不同)
- 条件2:该字段经常出现在where的后面,以条件的形式存在,也就是说这个字段总是被扫描
- 条件3:该字段很少的DML(insert delete update)操作。 (因为DML之后,索引需要重新排序建议不要随意添加索引,因为索引也是需要维护的,太多的话反而会降低系统的性能。
建议通过主键查询,建议通过unique约束的字段进行查询,效率是比较高的。
4、索引失效
第一种
因为在查找的时候必须知道第一个是啥,才能进行比对,%的话不知道第一个是啥,索引直接废了
第二种
这种时候建议使用union联合查询,先查出一个有索引的再查出没有索引的,这样分开查询,起码能走一个索引,用or两个都失效
第三种
复合索引,给两个字段加索引,查左边的走索引,查右边的失效
第四种
这个字段添加了索引,但是参加了运算,也会失效
第五种
在where中索引列使用了函数