事务:是一种机制,一个操作序列,包含了数据库的指令并且把所有的指令都看做是一个整体一起向系统进行提交或者撤销的操作。(事务的执行要么一起成功要么一起失败是一个不可分割的整体)
事务的特性:原子性,一致性,隔离性,持久性。(简称:ACID)
1.原子性:事务是一个整体。事务的各元素是不可分割的体现出了原子不可分性。所有元素必须作为一个整体提交或者回滚。
2.一致性:在事务开始之前数据库中的数据处于一致状态;在事务进行中数据可能不处于一致的状态(数据库中的数据有部分的修改);但是当事务完成时,数据必须再次回到已知的一致状态(事务不能使数据存储于不稳定的状态)。
3.隔离性:并发的事务都是彼此隔离的(事务都是独立的),不应以任何方式依赖于或影响其他事务。在事务开始的时候不可以对数据进行访问或者修改,直到该事务提交上去了才可以对数据进行相应的操作。
4.持久性:一旦事务被提交,事务对数据所做的任何变动都会被永久地保存在数据库中。事务的修改具有可恢复性,当事务提交失败时,它对事务的修改都会恢复到该事务执行前的状态。
MySQL执行事务的语法和流程:
存储引擎支持事务:InnoDB和BDB。(InnoDB存储引擎事务主要通过UNDO Log回滚日志和REDO Log重做日志,MyISAM存储引擎不支持事务)
语法和流程:
1.开始事务:BEGIN START TRANSACTION
2.提交事务:COMMIT
3.回滚(撤销)事务:ROLLBACK
事务并发出现的问题:
1.脏读
2.不可重复读
3.幻读
4.丢失修改
事务隔离级别:
1.读未提交(READ UNCOMITTED):如果一个事务读取到了另一个未提交事务修改过的数据,那么这种隔离级别就称之为读未提交。
2.读提交(READ COMMITTED):如果一个事务只能读取到另一个已提交事务修改过的数据,并且其它事务每对该数据进行一次修改并提交后,该事务都能查询得到最新值,那么这种隔离级别就称之为读提交。
3.可重复读(REPEATABLE READ):一个事务只能读取到另一个已提交事务修改过的数据,但是第一次读过某条记录后,即使其它事务修改了该记录的值并且提交,之后该事务再读该条记录时,读到的仍是第一次读到的值,而不是每次都读到不同的数据。那么这种隔离级别就称之为可重复读。
4.串行化(SERIALIZABLE):如果一个事务先根据某些条件查询出一些记录,之后另一个事务又向表中插入了符合这些条件的记录,原先的事务再次按照该条件查询时,能把另一个事务插入的记录也读出来。那么这种隔离级别就称之为串行化。
隔离级别由低到高:读未提交;读提交;可重复读;串行化。(低级别的隔离级别可以支持更高的并发处理,同时占用的系统资源更少)
索引:是一种特殊的数据库结构,由数据表中的一列或多列组成,可以用来快速查询数据表中的特定值的记录。(索引提高了查询的效率)
索引优点:
1.可以大大加快数据的查询速度。
2.在使用分组和排序子句进行数据查询时也可以显著减少查询中分组和排序的时间。
3.通过创建唯一索引可以保证数据库表中每一行数据的唯一性。
索引缺点:
1.创建和维护索引组要耗费时间,并且随着数据量的增加所耗费的时间也会增加。
2.索引需要占据磁盘空间,除了数据表占据数据空间外,每个索引还要占一定的物理空间。如果有大量的索引,索引文件可能比数据文件更快达到最大尺寸。
3.当对表中的数据进行增加,删除和修改的时候,索引也要动态维护,这样就降低了数据的维护速度。
[索引可以提高查询速度,但是会影响插入记录的速度。因为,向有索引的表中插入记录时,数据库系统会按照索引进行排序,这样就降低了插入记录的速度,插入大量记录时的速度影响会更加明显。这种情况下,最好的办法是先删除表中的索引,然后插入数据,插入完成后,再创建索引。]
索引分类:
存储方式分:B+Tree索引和HASH索引
逻辑区分:普通索引;唯一索引;主键索引;全文索引
实际使用区分:单列索引;组合索引
索引失效:
1.查询语句中使用LIKE关键字
2.查询语句中使用多列索引
3.查询语句中使用OR关键字
4.查询语句中使用函数
索引选择原则:
1.列的离散型
2.为经常需要排序,分组和联合操作的字段建立索引
3.为常作为查询条件的字段建立索引
4.限制索引的数目
5.尽量使用数据量少的索引
6.数据量小的表最好不要使用索引
7.尽量使用前缀来索引
8.删除不再使用或者很少使用的索引