MySQL(事务和索引)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/geek64581/article/details/101018076

事务和索引

1.事务

1.1 事务的介绍

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

事务的使用场景:

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

1.2 事务的四大特性

原子性(Atomicity)
一致性(Consistency)
隔离性(Isolation)
持久性(Durability)

1.3 事务的使用

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

查看MySQL数据库支持的表的存储引擎:

– 查看MySQL数据库支持的表的存储引擎
show engines;

说明:

  • 常用的表的存储引擎是 InnoDB 和 MyISAM
  • InnoDB 是支持事务的
  • MyISAM 不支持事务,优势是访问速度快,对事务没有要求或者以select、insert为主的都可以使用该存储引擎来创建表
  • 通过创表语句可以得知,goods表的存储引擎是InnoDB。
  • 修改表的存储引擎使用: alter table 表名 engine = 引擎类型;
    比如: alter table students engine = ‘MyISAM’;

1.4 开启事务:验证自己的sql语句是否正确

begin;

1.5 提交事务:事务一旦提交则回滚事务无效

commit;

1.6 回滚事务:返回事务开启之前的状态

rollback;

事务演练的SQL语句:

begin;
insert into students(name) values('李白');
--  查询数据,此时有新增的数据, 注意: 如果这里后续没有执行提交事务操作,那么数据是没有真正的更新到物理表中
select * from students;
--  新打开一个终端,重新连接MySQL数据库,查询students表,这时没有显示新增的数据,说明之前的事务没有提交,这就是事务的隔离性
-- 一个事务所做的修改操作在提交事务之前,对于其他事务来说是不可见的

-- 只有这里提交事务,才把数据真正插入到物理表中
commit;
  • pymysql 里面的 conn.commit() 操作就是提交事务
  • pymysql 里面的 conn.rollback() 操作就是回滚事务

2.索引

2.1 索引的介绍

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

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

2.2 索引的使用

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;

2.3案例-验证索引查询性能

创建测试表testindex:

create table test_index(title varchar(10));

向表中插入十万条数据:

from pymysql import connect

def 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;

2.4 联合索引

联合索引又叫复合索引,即一个索引覆盖表中两个或者多个字段,一般用在多个字段一起查询的时候。

-- 创建teacher表
create table teacher
(
    id int not null primary key auto_increment,
    name varchar(10),
    age int
);

-- 创建联合索引
alter table teacher add index (name,age);

联合索引的好处:

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

2.5 联合索引的最左原则

在使用联合索引的时候,我们要遵守一个最左原则,即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 这两种组合

说明:

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

2.6 小结

  • 索引是加快数据库的查询速度的一种手段
  • 创建索引使用: alter table 表名 add index 索引名[可选] (字段名, xxx);
  • 删除索引使用: alter table 表名 drop index 索引名;

猜你喜欢

转载自blog.csdn.net/geek64581/article/details/101018076