一、事务
事务:指用户定义的一系列执行SQL语句的操作,这些操作要么全部执行,要么都不执行,是一个不可分割的工作执行单元,如银行转账需执行多个SQL语句,但不允许中断
事务作用:能够保证数据的完整性和一致性,让用户的操作更加安全
事务四大特性
- 原子性:强调事务中的多个操作是一个整体,不能只执行其中一部分操作
- 一致性:强调数据库中不会保存不一致状态,即数据库总是从一个一致性的状态转换到另一个一致性的状态
- 隔离性:强调数据库中事务之间相互不可见,即一个事务所做的修改操作在提交事务之前,对于其他事务来说是不可见的
- 持久性:强调数据库能永久保存数据,一旦提交就不可撤销,其所做的修改会永久保存到数据库
事务的使用:须确保表的存储引擎为InnoDB类型(MySQL默认),只有该类型才可使用事务
表的存储引擎:提供存储数据一种机制,不同表的存储引擎提供不同的存储机制
- MySQL查看支持的表的存储引擎命令:show engines;
- 常用为 InnoDB 和 MyISAM
- InnoDB:支持事务
- MyISAM:不支持事务,优势是访问速度快,对事务无要求或以select、insert为主的可使用该存储引擎建表
查看创建表语句可知存储引擎,如下
修改表的存储引擎命令: alter table 表名 engine=存储引擎类型;
事务使用
开启事务: begin; 或 start transaction;
开启事务后执行修改命令,变更数据会保存到MySQL服务端的缓存文件中,不会维护到物理表中
MySQL默认采用自动提交(autocommit)模式,若未显示开启一个事务,则每条SQL语句都会当做一个事务执行提交操作
取消自动提交事务模式:set autocommit=0;
取消后需手动执行commit完成事务的提交
提交事务:commit;
提交事务是将本地缓存文件中的数据提交到物理表中,完成数据的更新
撤销/回滚事务:rollback;
撤销事务是放弃本地缓存文件中的缓存数据, 表示回到开始事务前的状态
事务结束:执行commit和rollback
说明:执行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 表名;
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;
具体操作举例如下
2.3联合索引
联合索引:又称复合索引,即一个索引覆盖表中两个或多个字段,一般用在多个字段一起查询的情况
优势:能够减少磁盘空间开销,每创建一个索引,就是创建了一个索引文件,会增加磁盘空间开销
联合索引最左原则:使用联合索引应遵循最左原则,如index(name,age)支持 name 、name 和 age 组合查询,而不支持单独 age 查询,因为没有用到创建的联合索引