-
数据库索引与事务
-
索引
-
概念
-
一个排序的列表,为了实现对表的快速查询(类似于目录),把一个列作为索引。
-
对于有序的列表,就可以使用二分法进行快速查询,也叫B树查询。
-
-
如果没有索引,那么就会遍历整个表(横着一个一个)。
-
-
优点:
-
大大提高了查询的速度
-
提高跨表查询的速度
-
降低服务器IO的成本,排序成本
-
-
缺点
-
消耗额外的磁盘空间,索引列的字符数越多消耗存储资源越大
-
-
划分
-
物理角度
-
聚簇索引
-
比如:电话簿,目录后直接附加内容,不需要额外寻找,适合主键索引,同一个表只能有一个聚簇索引。
-
-
非聚簇索引
-
比如:书的目录,找到对应的目录后还得去翻到相应页才能看到内容,这就是非聚簇索引,同一个表可以有多个非聚簇索引。
-
-
-
逻辑角度常见的索引
-
普通索引
-
也就是默认索引,默认采用B树索引
-
-
唯一索引
-
索引列的值必须唯一,允许为空,可以有多个
-
-
主键索引
-
索引列的值唯一且不能为空,只能有一个
-
-
组合索引(最左前缀)
-
将多个列共同组成一个索引,需要注意搜索时的顺序必须与创建组合索引时的顺序一致。
-
-
全文索引(fulltext)
-
主要针对文本类的,消耗资源最多
-
-
-
-
创建
-
一般创建方式:
-
在创建时创建
-
alter添加索引
-
创建时指定索引
-
-
普通索引
-
创建索引
-
create index 索引名称 on 表名 (哪一列(长度));
-
-
修改表结构
-
alter table 表名 add index 索引名(哪一列(长度));
-
-
创建时指定
-
create table t1 (id int(10),name char(20),index 索引名(哪一列(长度))
-
-
-
唯一索引
-
创建索引
-
create unique index 索引名 on 表名(那一列(长度));
-
-
修改表结构
-
alter table 表名 add unique index 索引名(哪一列(长度));
-
-
创建时指定
-
create table t1 (id int(10),name char(20),unique index 索引名(哪一列(长度))
-
-
-
主键索引
-
一个表只能有一个主键,在创建时指定主键时就同时创建,
-
指定主键:primary key (列名)
-
-
组合索引
-
create table t1 (id int(10),name char(20),index 索引名(列名,列名,。。。)
-
需要注意使用组合索引时必须按照创建时的顺序
-
-
全文索引
-
针对整个文本,消耗存储资源大
-
创建索引
-
create fulltext index 索引名 on 表名(那一列)
-
-
-
-
创建依据
-
表的主键、外键必须有索引。因为主键具有唯一性,外键关联的是子表的主键,查询时可以快速定位。
-
记录数超过300行的表应该有索引。如果没有索引,需要把表遍历一遍,会严重影响数据库的性能。
-
经常与其他表进行连接的表,在连接字段上应该建立索引。
-
唯一性太差的字段不适合建立索引。
-
更新太频繁地字段不适合创建索引。
-
原本的索引会失效,造成浪费
-
-
经常出现在 where 子句中的字段,特别是大表的字段,应该建立索引。索引应该建在选择性高的字段上。
-
索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引。
-
-
索引维护
-
重建
-
删除索引
-
drop index 索引名 on 表名
-
-
-
-
-
事务
-
一系列sql语句的集合,要么这些语句全都执行,要么全都不执行,
-
特性
-
原子性(不可分割性)
-
一致性
-
类似于能量守恒,这边有所减少,对应的应该有所增加。
-
-
独立性
-
多个事务并发进行,在排除数据关联性的前提下,应互不干扰。
-
-
持久性
-
事务对数据的影响应该是持久性
-
-
-
怎么使用
-
begin; sql语句序列 commit;
-
注意事项
-
有些版本默认开启了自动提交功能可以将其关闭
-
set autocommit=0
-
-
rollback是将整个事务回滚。
-
保存点
-
savepoint 保存点名称
-
通过rollback to 保存点名称
-
-
-
-
-