美文网首页
Python | Mysql | 事务 | 索引

Python | Mysql | 事务 | 索引

作者: CarryLili | 来源:发表于2019-08-13 00:55 被阅读0次

前言:

事务就是用户定义的一系列执行SQL语句的操作, 这些操作要么完全地执行,要么完全地都不执行, 它是一个不可分割的工作执行单元。

事务的使用场景:
在日常生活中,有时我们需要进行银行转账,这个银行转账操作背后就是需要执行多个SQL语句,假如这些SQL执行到一半突然停电了,那么就会导致这个功能只完成了一半,这种情况是不允许出现,要想解决这个问题就需要通过事务来完成。接下来,我就以银行转账为例进行讲解事务四大特性

事务的特性:

  • 原子性
  • 一致性
  • 隔离性
  • 持久性
原子性:

一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作,这就是事务的原子性

一致性:

数据库从一个一致性的状态转换到另一个一致性的状态。例如:我给大哥转账200元,就算转账过程中系统崩溃,我也不会损失200元,因为事务最终没有提交,所以事务中所做的修改也不会保存到数据库中。

隔离性:

通常来说,一个事务所做的修改操作在提交事务之前,对于其他事务来说是不可见的。例如:我给大哥转账,大哥给大哥的大哥转账,这是属于两个事务,一个事务的执行,不会影响到另一个事务,强调的是数据库中事务之间相互不可见。

持久性:

一旦事务提交,则其所做的修改会永久保存到数据库。

事务能够保证数据的完整性和一致性,让用户的操作更加安全。

在使用事务之前,先要确保表的存储引擎是 InnoDB 类型, 只有这个类型才可以使用事务,MySQL数据库中表的存储引擎默认是 InnoDB 类型。

查看MySQL数据库支持的表的存储引擎:
SHOW ENGINES;
查看数据库默认的存储引擎:
SHOW VARIABLES LIKE 'storage_engine';
修改表的引擎:
alter table 表名 engine = 引擎类型;
例:alter table students engine = 'MyISAM';
注意:
  • 常用的表的存储引擎是 InnoDB 和 MyISAM
  • InnoDB 是支持事务的,支持索引和事务回滚,也支持缓存
  • MyISAM 不支持事务,优势是访问速度快,对事务没有要求或者以select,insert为主的都可以使用该存储引擎来创建表
  • 事务开始:begin
  • 事务提交:commit
  • 事务回滚:rollback

索引

索引在MySQL中也叫做“键”,它是一个特殊的文件,它保存着数据表里所有记录的位置信息,更通俗的来说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度。

当数据库中数据量很大时,查找数据会变得很慢,我们就可以通过索引来提高数据库的查询效率。

查看表中已有索引:

show index from 表名;

创建索引:

alter table 表名 add index 索引名[可选](列名, ..)
#给name字段添加索引
例:alter table classes add index my_name (name);

删除索引:

alter table 表名 drop index 索引名
例:alter table classes drop index my_name;

联合索引:

alter table teacher add index (索引字段1,索引字段2);
联合索引的好处:

减少磁盘空间开销,因为每创建一个索引,其实就是创建了一个索引文件,那么会增加磁盘空间的开销。

联合索引最左原则:

下面的查询使用到了联合索引
select * from stu where name='张三' -- 这里使用了联合索引的name部分
select * from stu where name='李四' and age=10 -- 这里完整的使用联合索引,包括 name 和 age 部分 

下面的查询没有使用到联合索引
select * from stu where age=10 -- 因为联合索引里面没有这个组合,只有 name | name age 这两种组合
说明:

在使用联合索引的查询数据时候一定要保证联合索引的最左侧字段出现在查询条件里面,否则联合索引失效

MySQL中索引的优点和缺点和使用原则

优点:

  • 加快数据的查询速度
    缺点:
  • 创建索引会耗费时间和占用磁盘空间,并且随着数据量的增加所耗费的时间也会增加

补充说明:

1,通过优缺点对比,不是索引越多越好,而是需要自己合理的使用。
2,对经常更新的表就避免对其进行过多索引的创建,对经常用于查询的字段应该创建索引,
3,数据量小的表最好不要使用索引,因为由于数据较少,可能查询全部数据花费的时间比遍历索引的时间还要短,索引就可能不会产生优化效果。
4,在一字段上相同值比较多不要建立索引,比如在学生表的"性别"字段上只有男,女两个不同值。相反的,在一个字段上不同值较多可是建立索引。

相关文章

网友评论

      本文标题:Python | Mysql | 事务 | 索引

      本文链接:https://www.haomeiwen.com/subject/ecrpjctx.html