Mysql 六: 数据库事物、索引

一、事务

当一个业务逻辑需要多个sql完成时,如果其中 某条sql语句出错,则希望整个操作都退回。

使用事务可以完成退回的功能,保证 业务逻辑的正确性。

事务四大特性 : (简称 ACID )

原子性(Atomicity) : 事务中的全部操作在数据库中是不可分割的,要么全部完成,

要么均不执行。

一致性(Consistency): 几个并行执行的事务,其执行结果必须与按某一顺序

串行执行的的结果相一致。

隔离性(Isolation) : 事务的执行不受其他事务的干扰,事务执行的中间结果

必须对其他事务是透明的。

持久性(Durability) : 对于任意已提交 事务,系统必须保证该事务

对数据库的改变不被丢失,即使数据库 出现故障。

一个最常见的 事务 : 银行转账

你 给 别人转账,结果 : 你账户的钱减少 , 他账户的钱增加

原子性 : 要么你的钱没减少他的钱没增加 (转账失败,都不执行)

要么你的钱减少他的钱增加 (转账成功,都执行了)

一致性 : 是他的钱先增加还是你的钱先减少或者同时发生对 最终 结果没有影响

隔离性 : 你在给别人 转钱,其他人也在给这个人转钱,现在这个交易不受其他

交易影响

持久性 : 要保证 这次转账生效。

要使用事务的要求 :、

表的类型 必须是 innodb 或 bdb 类型,才可以对此表使用事事务。

查看表的创建语句 :

show create table students;

修改表的 类型 :

alter table '表名' engine=innodb;

事务语句 :

开启 begin ;

提交 commit ;

回滚 rollback ;

例如 : 我需要修改 students 表中 某人 的name 。

1.执行 begin (注意,此时数据库里面这条要被更新的数据已经被锁起来了,

其他人不能更改这条数据,要更改就会导致阻塞,但是还是可以查询),

此时会生成一张内存级的临时表,

然后将这条数据拷贝到这张临时表里面执行 我们的 sql 语句 ,得到结果。

此时你进行查询,查询的 是临时表 ,别人做查询,查询 的是内存表,所以得到

的结果可能会 不一样。

2. 执行 commit , 此时会将临时表中的 数据拷贝到数据库里面的 表 中,

原表的锁被打开。

3.执行 rollback , 此时数据库里面的表的数据会恢复到 brgin 之前的状态,

并且内存级的临时表也会消失 ,原表的锁被打开。

二、索引

索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。

打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车。

索引分单列索引和组合索引。

单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。

组合索引,即一个索引包含多个列。

创建索引时,你需要确保该索引是应用在 SQL 查询语句的条件(一般作为 WHERE 子句的条件)。

实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。

但过多的使用索引将会造成滥用。因此索引也会有它的缺点:虽然索引大大提高了查询速度,

同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,

MySQL不仅要保存数据,还要保存一下索引文件。

建立索引会占用磁盘空间的索引文件。

开启时间监测 :

set profiles=1;

查看执行时间 :

show profiles;

查询衡阳市的所有信息:

select * from areas where atitle='衡阳';

给城市创建索引 :

语法 : create index 索引 on 表名(字段名(20));

为 表areas 的 atitle 列创建索引 :

create index titleIndex on areas(atitle(20));

再次查询:

select * from areas where atitle='衡阳';

查看创建索引前后查询所需要的时间 :

show profiles;

+----------+------------+----------------------------------------------+

| Query_ID | Duration | Query |

+----------+------------+----------------------------------------------+

| 1 | 0.00013000 | select * from areas |

| 2 | 0.00006600 | select * from areaswhere atitle='??' |

| 3 | 0.00026500 | select * from areas where atitle='??' |

| 4 | 0.00025300 | show index from areas |

| 5 | 0.00211200 | create index titleIndex on areas(atitle(20)) |

| 6 | 0.00032800 | select * from areas where atitle='??' |

+----------+------------+----------------------------------------------+

当数据量特别大的时候,创建 索引是很有必要的。

也可以在创建表的时候直接指定索引 :

CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, UNIQUE [indexName] (username(length)) //指定索引 );

关于索引的 具体情况见以下链接

http://www.runoob.com/mysql/mysql-index.html

--------------------------------------------------------------------------

创建索引可以认为是在物理内存中给数据添加了一个字典的拼音索引一样的东西 ,

以后需要查询数据的时候通过这个索引查找,这样就不用像原来那样一行一行的遍历,

可以跳过许多不相关的数据,从而提高了查询速度,但是如果要对数据进行更改,那么索引也

需要跟着 改,所以更改起来会变慢。

--------------------------------------------------------------------------

猜你喜欢

转载自blog.csdn.net/qq_26128879/article/details/82595086