索引
由于数据库中的数据随着数据的增加,查询的速度也会变慢,索引可以提高查询效率。
索引的概念
选取表中的某一列或几列数据,构成便于查询的树结构(如B+tree),在目录中可以直接查询到某条数据的具体地址,避免全局扫描。
索引分类
- 主键索引:创建列表时,把字段声明为主键时,会自动创建主键索引
- 唯一索引:创建列表时,把字段声明为唯一键时,可以为空,会自动创建唯一索引
- 普通索引:在普通字段上创建的索引
- 组合索引:由两个以上字段组合创建的索引
创建索引
基本语法:
create index <索引名> on <表名>(字段1,字段2...);
创建唯一索引(有一列没有被声明为唯一键,但是可以确定此列数据没有重复,则可以依次列创建唯一索引):
create unique index <索引名> on <表名>(字段);
查询索引
查询数据表的索引:
show indexs from 表名;
查询索引:
show keys from 表名;
ps:5.6版本更新了一个全文索引,但是不支持中文,了解一下即可。
删除索引
drop index +索引名 on 表名;
索引使用总结
1、优点
- 索引大大降低了查询时的数据量,提高了查询效率
- 索引根据列,把随机IO变成了顺序IO
2、缺点 - 索引随着DML更新而更新
- 索引会占据磁盘空间
3、注意事项 - 数据量大且DML语句频繁时不要使用索引
- 数据量少时全盘扫描更快,不要使用索引
- 重复数据多的列不要建立索引
- 创建索引后注意查询SQL语句的编写,避免索引失效
数据库事务
概念
事务是完成一个业务的多个DML操作
特性(ACID特性)
- 原子性:事务中的DML操作要么同时完成,要么同时不完成(其中之前完成后面的没完成,要对之前的操作进行还原:回滚)
- 一致性:事务执行前与事务执行后数据库中的数据是一致的,完整性和一致性不被破坏
- 隔离性:允许多个事务同时执行,不同事务之间互不影响
- 持久性:事务完成后对数据的操作是永久性的
数据库的事务管理
自动提交与手动提交
当我们在客户端执行DML操作时,先将操作写入缓存,缓存默认自动提交到数据库进行更改数据
事务管理
1、开启事务:作用时关闭自动提交
start transaction;
2、然后执行事务中的各项操作,如果有错误则执行rollback,作用是清除缓存中的操作 3、提交事务
作用是把缓存中的操作提交到数据库中
commit;
事务隔离级别
- 读未提交 read uncommitted
两个客户端同时执行两个独立的事件一和二,事件2可以查询到事件1已执行但未提交的操作,存在缓存里,如果事件2读取成功后,时间1之后的操作没完成而发生了回滚,则称事件2读取操作为脏读。 - 读已提交 read committed (避免了脏读)
两个客户端同时执行两个独立的事件一和二,事件2只能查询到事件1已提交的操作,若事件2中有2次及以上读取同一数据的操作,第一次读取时事件1还没提交,读第二次时事件1提交了,事件2前后读取的数据不同,称为虚读(不可重复读)。 - 可重复读 repeatable read(避免了脏读和虚读)
事件1操作时,不允许其他事件对对应数据进行修改,但可以进行添加,当事件1把全部数据的一个字段修改为1,事件2新增一个此字段为2的数据,事件1在读取时会出现没修改的2,称为幻读。 - 串行化 serializable(避免了脏读、虚读和幻读)
此级别的事件执行时不允许其他事件对数据库进行操作
事务的隔离级别修改
1、mysql数据库默认的事务隔离级别是:repeatable read 2、可以通过设置数据库默认的事务隔离级别控制隔离性,也可以设置客户端与数据库连接设置来设置事务隔离性(应用设置)
3、查看数据库的默认事务隔离级别: 版本8.0.3之前
select @@tx_isolation;
版本8.0.3之后
select @@transaction_isolation;
4、设置数据库的默认事件隔离级别
set session transaction isolation level + 事务隔离级别英文;
|