一、事务

事务:指用户定义的一系列执行SQL语句的操作,这些操作要么全部执行,要么都不执行,是一个不可分割的工作执行单元,如银行转账需执行多个SQL语句,但不允许中断

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

事务四大特性

  • 原子性:强调事务中的多个操作是一个整体,不能只执行其中一部分操作
  • 一致性:强调数据库中不会保存不一致状态,即数据库总是从一个一致性的状态转换到另一个一致性的状态
  • 隔离性:强调数据库中事务之间相互不可见,即一个事务所做的修改操作在提交事务之前,对于其他事务来说是不可见的
  • 持久性:强调数据库能永久保存数据,一旦提交就不可撤销,其所做的修改会永久保存到数据库

事务的使用:须确保表的存储引擎为InnoDB类型(MySQL默认),只有该类型才可使用事务

表的存储引擎:提供存储数据一种机制,不同表的存储引擎提供不同的存储机制

  • MySQL查看支持的表的存储引擎命令:show engines;
  • 常用为 InnoDB 和 MyISAM
  • InnoDB:支持事务
  • MyISAM:不支持事务,优势是访问速度快,对事务无要求或以select、insert为主的可使用该存储引擎建表

mysql事务实现 Java mysql事务sql语句怎么实现_mysql

查看创建表语句可知存储引擎,如下

修改表的存储引擎命令: alter table 表名 engine=存储引擎类型;

mysql事务实现 Java mysql事务sql语句怎么实现_db_02

 事务使用

开启事务: begin; 或 start transaction;
开启事务后执行修改命令,变更数据会保存到MySQL服务端的缓存文件中,不会维护到物理表中
MySQL默认采用自动提交(autocommit)模式,若未显示开启一个事务,则每条SQL语句都会当做一个事务执行提交操作

取消自动提交事务模式:set autocommit=0;
取消后需手动执行commit完成事务的提交

提交事务:commit;
提交事务是将本地缓存文件中的数据提交到物理表中,完成数据的更新

撤销/回滚事务:rollback;
撤销事务是放弃本地缓存文件中的缓存数据, 表示回到开始事务前的状态

事务结束:执行commit和rollback

mysql事务实现 Java mysql事务sql语句怎么实现_sql_03

mysql事务实现 Java mysql事务sql语句怎么实现_db_04

说明:执行commit手动提交后,数据才真正添加到表中,由于是临时关闭自动提交模式,需重新打开另一命令连接终端查看表的数据信息

  • pymysql中conn.commit() 操作就是提交事务
  • pymysql中conn.rollback() 操作就是撤销/回滚事务

二、索引

索引:MySQL中又称为键,是一个特殊的文件,保存着记录表里的所有记录的位置信息,数据库索引就像目录,能够加快数据库的查询速度,是加快数据库查询速度的一种手段

  • 优点:能够加快数据查询速度
  • 缺点:创建索引会耗费时间和占用磁盘空间,且随着数据量的增加所耗费的时间也会增加
  • 使用原则
  • 索引不是越多越好,需合理使用
  • 经常更新的表应避免过多索引,经常查询的表的字段应创建索引
  • 数据量小的表不宜创建索引,因为查询全部数据时间可能比遍历索引时间还要短
  • 一个字段上相同值较多不宜创建索引,如性别只有男女,不同值较多可创建索引

2.1使用索引 

查看表中索引:show index from 表名;

创建索引:alter table 表名 add index 索引名[可选](列名,...);
说明:若索引名不指定,默认使用字段名

删除索引:alter table 表名 drop index 索引名;
说明:若不知道索引名,可查看建表SQL语句==>show create table 表名;

mysql事务实现 Java mysql事务sql语句怎么实现_mysql事务实现 Java_05

2.2验证索引查询性能

数据库编程向teacher空表中插入100万条数据

import pymysql
# 创建连接对象
conn = pymysql.connect(host="localhost", port=3306, user='root', password='******', database='python_sql', charset='utf8')
cur = conn.cursor()   # 获取游标对象
for i in range(1000000):  # 此处选取过大,建议改为10万
    cur.execute("insert into teacher(id,name,sid) values('%d'+1,'老师-%d','%d')" % (i, i, i))  # 执行SQL语句,插入100万条数据
conn.commit()  # 提交数据
cur.close()  # 关闭游标
conn.close()  # 关闭连接

验证索引性能操作

开启运行事件监测:set profiling=1;
查找数据:select * from 表名 where 条件约束;
查看执行时间:show profiles;

创建索引:alter table 表名 add index 索引名(字段名);
再次查找数据:select * from 表名 where 条件约束;
再次查看执行时间:show profiles;

具体操作举例如下

mysql事务实现 Java mysql事务sql语句怎么实现_数据库_06

mysql事务实现 Java mysql事务sql语句怎么实现_mysql_07

2.3联合索引 

联合索引:又称复合索引,即一个索引覆盖表中两个或多个字段,一般用在多个字段一起查询的情况

优势:能够减少磁盘空间开销,每创建一个索引,就是创建了一个索引文件,会增加磁盘空间开销

联合索引最左原则:使用联合索引应遵循最左原则,如index(name,age)支持 name 、name 和 age 组合查询,而不支持单独 age 查询,因为没有用到创建的联合索引

mysql事务实现 Java mysql事务sql语句怎么实现_数据库_08