MySql的事物和索引
♪
画龙
01事务
1.事务的四大特性
原子性(Atomicity)
一致性(Consistency)
隔离性(Isolation)
持久性(Durability)
原子性:一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作,这就是事务的原子性
一致性:数据库总是从一个一致性的状态转换到另一个一致性的状态。(在前面的例子中,一致性确保了,即使在转账过程中系统崩溃,支票账户中也不会损失200美元,因为事务最终没有提交,所以事务中所做的修改也不会保存到数据库中。)
隔离性:通常来说,一个事务所做的修改操作在提交事务之前,对于其他事务来说是不可见的。(在前面的例子中,当执行完第三条语句、第四条语句还未开始时,此时有另外的一个账户汇总程序开始运行,则其看到支票帐户的余额并没有被减去200美元。)
持久性:一旦事务提交,则其所做的修改会永久保存到数据库。
说明:事务能够保证数据的完整性和一致性,让用户的操作更加安全。
2.MySQL数据库默认采用自动提交(autocommit)模式, 也就是说修改数据(insert、update、delete)的操作会自动的触发事务,完成事务的提交或者回滚
3.开启事务使用 begin 或者 start transaction;
4.回滚事务使用 rollback;
5.pymysql 里面的 conn.commit() 操作就是提交事务
6.pymysql 里面的 conn.rollback() 操作就是回滚事务
02索引
应用场景:当数据库中数据量很大时,查找数据会变得很慢,我们就可以通过索引来提高数据库的查询效率。
索引的使用查看表中已有索引:
show index from 表名;
说明:主键列会自动创建索引
索引的创建:
– 创建索引的语法格式
– alter table 表名 add index 索引名可选
– 给name字段添加索引alter table classes add index my_name (name);
说明:索引名不指定,默认使用字段名
索引的删除:
– 删除索引的语法格式–
alter table 表名 drop index 索引名
– 如果不知道索引名,可以查看创表sql语句show create table classes;
alter table classes drop index my_name;
案例
-验证索引查询性能创建测试表
testindex:create table test_index(title varchar(10));
向表中插入十万条数据:
from pymysql import connectdef main():
# 创建Connection连接
conn=connect(host=‘localhost’,port=3306,database=‘python’,user=‘root’,password=‘mysql’,charset=‘utf8’)
# 获得Cursor对象
cursor = conn.cursor()
# 插入10万次数据for i in range(100000):
cursor.execute(“insert into test_index values(‘ha-%d’)” % i)
# 提交数据conn.commit()
if name == “main”:main()
验证索引性能操作:
– 开启运行时间监测:
set profiling=1;
– 查找第1万条数据ha-99999
select * from test_index where title=‘ha-99999’;
– 查看执行的时间:
show profiles;
– 给title字段创建索引:
alter table test_index add index (title);
– 再次执行查询语句
select * from test_index where title=‘ha-99999’;
– 再次查看执行的时间show profiles;
联合索引
1.减少磁盘空间开销,因为每创建一个索引,其实就是创建了一个索引文件,那么会增加磁盘空间的开销。
2.联合索引又叫复合索引,即一个索引覆盖表中两个或者多个字段,一般用在多个字段一起查询的时候。
– 创建teacher表
create table teacher(id int not null primary key auto_increment,name varchar(10),age int);
– 创建联合索引
alter table teacher add index (name,age);
联合索引的最左原则
在使用联合索引的时候,我们要遵守一个最左原则,即index(name,age)支持 name 、name 和 age 组合查询,而不支持单独 age 查询,因为没有用到创建的联合索引。
最左原则示例:
– 下面的查询使用到了联合索引
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中索引的优点和缺点和使用原则
优点:加快数据的查询速度
缺点:创建索引会耗费时间和占用磁盘空间,并且随着数据量的增加所耗费的时间也会增加
使用原则:通过优缺点对比,不是索引越多越好,而是需要自己合理的使用。
对经常更新的表就避免对其进行过多索引的创建,对经常用于查询的字段应该创建索引,
数据量小的表最好不要使用索引,因为由于数据较少,可能查询全部数据花费的时间比遍历索引的时间还要短,索引就可能不会产生优化效果。
在一字段上相同值比较多不要建立索引,比如在学生表的"性别"字段上只有男,女两个不同值。相反的,在一个字段上不同值较多可是建立索引。