事务:指用户定义的一系列执行SQL语句的操作,这些操作要么全部执行,要么都不执行,是一个不可分割的工作执行单元,如银行转账需执行多个SQL语句,但不允许中断
事务作用:能够保证数据的完整性和一致性,让用户的操作更加安全
事务四大特性
事务的使用:须确保表的存储引擎为InnoDB类型(MySQL默认),只有该类型才可使用事务
表的存储引擎:提供存储数据一种机制,不同表的存储引擎提供不同的存储机制
查看创建表语句可知存储引擎,如下
修改表的存储引擎命令: alter table 表名 engine=存储引擎类型;
事务使用
- 开启事务: begin; 或 start transaction;
- 开启事务后执行修改命令,变更数据会保存到MySQL服务端的缓存文件中,不会维护到物理表中
- MySQL默认采用自动提交(autocommit)模式,若未显示开启一个事务,则每条SQL语句都会当做一个事务执行提交操作
-
- 取消自动提交事务模式:set autocommit=0;
- 取消后需手动执行commit完成事务的提交
-
- 提交事务:commit;
- 提交事务是将本地缓存文件中的数据提交到物理表中,完成数据的更新
-
- 撤销/回滚事务:rollback;
- 撤销事务是放弃本地缓存文件中的缓存数据, 表示回到开始事务前的状态
-
- 事务结束:执行commit和rollback
说明:执行commit手动提交后,数据才真正添加到表中,由于是临时关闭自动提交模式,需重新打开另一命令连接终端查看表的数据信息
索引:MySQL中又称为键,是一个特殊的文件,保存着记录表里的所有记录的位置信息,数据库索引就像目录,能够加快数据库的查询速度,是加快数据库查询速度的一种手段
- 查看表中索引:show index from 表名;
-
- 创建索引:alter table 表名 add index 索引名[可选](列名,...);
- 说明:若索引名不指定,默认使用字段名
-
- 删除索引:alter table 表名 drop index 索引名;
- 说明:若不知道索引名,可查看建表SQL语句==>show create table 表名;
数据库编程向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;
具体操作举例如下
联合索引:又称复合索引,即一个索引覆盖表中两个或多个字段,一般用在多个字段一起查询的情况
优势:能够减少磁盘空间开销,每创建一个索引,就是创建了一个索引文件,会增加磁盘空间开销
联合索引最左原则:使用联合索引应遵循最左原则,如index(name,age)支持 name 、name 和 age 组合查询,而不支持单独 age 查询,因为没有用到创建的联合索引
学习导航: http://xqnav.top/