索引
索引的概念
索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引, 并指定索引的类型,各类索引有各自的数据结构实现。索引就好比字典的(拼音和部首查字一样),可以帮助我们快速的查找想要的信息。
索引的作用
就一句话,加快查询数据的速度。
- 数据库中的表、数据、索引之间的关系,类似于书架上的图书、书籍内容和书籍目录的关系。
- 索引所起的作用类似书籍目录,可用于快速定位、检索数据。
- 索引对于提高数据库的性能有很大的帮助。
索引使用场景
要考虑对数据库表的某列或某几列创建索引,需要考虑以下几点:
1.数据量较大,且经常对这些列进行条件查询。
2.该数据库表的插入操作,及对这些列的修改操作频率较低。
3.索引会占用额外的磁盘空间,所以磁盘空间需要充足。(存放在磁盘的.ibd文件里)
满足以上条件时,考虑对表中的这些字段创建索引,以提高查询效率。反之,如果非条件查询列,或经常做插入、修改操作,或磁盘空间不足时,不考虑创建索引。
不适合使用的场景
(1)对于插入、删除数据频率高的表,不适用索引
(2)对于某列修改频率高的,该列不适用索引
(3)通过某列或某几列的条件查询频率高的,可以对这些列创建索引
索引的使用
创建主键约束(PRIMARY KEY)、唯一约束(UNIQUE)、外键约束(FOREIGN KEY)时,会自动创建对应列的索引。
查看索引 show index from 表名;
创建索引:对于非主键、非唯一约束、非外键的字段,可以创建普通索引
create index 索引名 on 表名(字段名);
删除索引
drop index 索引名 on 表名;
索引保存的数据结构主要为B+树,(一颗特殊的二叉搜索树)及hash的方式.
MYSQL的隔离级别
出现隔离的原因:
1、脏读:一个事务中读取到数据是错误的数据,例如事务A读取到了正在执行的事务B修改过的数据,但事务B并没有进行提交。而A读后事务B执行了回滚操作,对数据的更改也就撤回了,即数据值还是原来值,而A读到的是B修改过后的值。
2、不可重书读:事务A使用同一个查询条件,读取到的内容不一致,(其他事务修改了该值且提交了事务)
3、幻读:事务A使用相同的查询条件,两次查询的数据个数不一样。例如事务A查询1班所有人的信息时,查到了11个人,紧接着事务B又插入(或者删除一个数据)了一个同学的信息,而A有查询了一遍,发现居然变成了12个人,就类似自己出现幻觉一样,因此成为幻读。
幻读和不可重复读的区别?
侧重点不同,不可重复度的侧重点是修改,幻读是添加或者删除。
为了解决以上的问题出现了事务的隔离级别。
Mysql的四种隔离级别
SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。
-
Read Uncommitted(读取未提交内容)
在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)。
就好比还没确定的消息,你却先知道了发布出去,最后又变更了,就是说瞎话了。常说的脏读,读到了还未提交的。 -
Read Committed(读取提交内容)
这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别 也支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。 -
Repeatable Read(可重复读)
这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题 -
Serializable(可串行化)
这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。
事务顺序执行,没有并行,完全杜绝幻读。
事务
为什么要使用事务
通过下面的例子来说明:
drop table if exists accout;
create table accout(
id int primary key auto_increment,
name varchar(20) comment ‘账户名称’,
money decimal(11,2) comment ‘金额’
);
insert into accout(name, money) values (‘阿里巴巴’, 5000),(‘四十大盗’, 1000);
比如说,四十大盗把从阿里巴巴的账户上偷盗了2000元
– 阿里巴巴账户减少2000
update accout set money=money-2000 where name = ‘阿里巴巴’;
– 四十大盗账户增加2000
update accout set money=money+2000 where name = ‘四十大盗’;
假如在执行以上第一句SQL时,出现网络错误,或是数据库挂掉了,阿里巴巴的账户会减少2000,但是 四十大盗的账户上就没有了增加的金额。那么钱去哪里了呢,不翼而飞了?这时候我们就需要使用事务来控制,保证以上两句SQL要么全部执行成功,要么全部执行失败。
事物的概念
事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败。 在不同的环境中,都可以有事务。对应在数据库中,就是数据库事务。
事务的四大特性(ACID)
1、原子性:要么全部成功(commit结束事务),要么全部失败(rollback进行回滚)
2、持久性:事务执行的结构一定要永久保存下来。
3、一致性:事务执行前和执行后,数据必须保证正确的
4、隔离性:多个事务在执行的时候要相互隔离
事务的使用
事务三板斧
(1)开启事务:start transaction;
(2)执行多条SQL语句
(3)回滚或提交:rollback/commit;
说明:rollback即是全部失败,commit即是全部成功。
例如:
start transaction;--开启事务
– 阿里巴巴账户减少2000
update accout set money=money-2000 where name = ‘阿里巴巴’;
– 四十大盗账户增加2000
update accout set money=money+2000 where name = ‘四十大盗’;
commit;--执行commit说明正常结束
查表时可以不开启事务,但增删改一定要开启事务,以保证数据的安全与准确,防止断网等事故造成的错误;