赞
踩
索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引, 并指定索引的类型,各类索引有各自的数据结构实现。
事务是基于重做日志文件(redo log)和回滚日志(undo log)实现的。
每提交一个事物必须先将事务的所有日志写入到重做日志文件中进行持久化,数据库就可以通过重做日志来保证事务的原子性和持久性
每当有修改事务时,还会产生undo log,如果需要回滚,则根据undo log的反向语句进行逻辑操作,比如insert一条记录就会delete一条记录,undo log主要实现数据库的一致性
就一句话,加快查询数据的速度。
可以使用explain来进行查看SQL的执行:
要考虑对数据库表的某列或某几列创建索引,需要考虑以下几点:
满足以上条件时,考虑对表中的这些字段创建索引,以提高查询效率。
反之,如果非条件查询列,或经常做插入、修改操作,或磁盘空间不足时,不考虑创建索引。
创建主键约束(PRIMARY KEY)、唯一约束(UNIQUE)、外键约束(FOREIGN KEY)时,会自动创建对应列的索引。
show index
from 表名;
对于非主键、非唯一约束、非外键的字段,可以创建普通索引
create index
索引名on
表名(字段名);或者 alert table 表名 add fulltext index ‘索引名’(‘列名’);
drop index
索引名on
表名;
索引保存的数据结构主要为B+树,及hash的方式.
从使用者的角度分类:
主键索引(也有语义上的约束):某一个属性组能唯一标识一条记录
唯一键索引(也有语义上的约束)
作用 : 避免同一个表中某数据列中的值重复
与主键索引的区别
普通索引(没有语义上的约束,纯粹是为了提升查询速度而使用)
全文索引(FULLTEXT)
聚集索引(索引之间有关系)和非聚簇索引
覆盖索引:只需要在一张表里获取到sql所需要的所有列数据,无需回表,速度更快
如何实现覆盖索引:将被查询的字段建立道联合索引里面去
创建一个user表,并为name字段创建索引
create table user (
id int primary key,
name varchar(20),
sex varchar(5),
index(name)
)engine=innodb;
select id,name from user where name='shenjian';
能够命中name索引,索引叶子节点存储了主键id,通过name的索引树即可获取id和name,无需回表,符合索引覆盖,效率较高。
select id,name,sex* from user where name='shenjian';
能够命中name索引,索引叶子节点存储了主键id,但sex字段必须回表查询才能获取到,不符合索引覆盖,需要再次通过id值扫码聚集索引获取sex字段,效率会降低。
改进:如果把(name)单列索引升级为联合索引(name, sex)就不同了。
create table user (
id int primary key,
name varchar(20),
sex varchar(5),
index(name, sex)
)engine=innodb;
可以看到:都能够命中索引覆盖,无需回表。
select id,name from user where name='shenjian';
select id,name,sex from user where name='shenjian';
什么是回表查询
非聚簇索引一定会回表查询吗?
准备测试表:
==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要么全部执行成功,要么全部执行失败。
事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败。 在不同的环境中,都可以有事务。对应在数据库中,就是数据库事务。
修改了数据)
添加或删除了数据
经典面试题:不可重复度和幻读的区别?
二者的侧重点不同,不可重复读的侧重点是修改数据,而幻读的侧重点是添加或者删除数据
SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。
在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)。
这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别也支持所谓的不可重复读,因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。
是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读 。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,)机制解决了该问题。
这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。
事务三板斧
说明:rollback即是全部失败,commit即是全部成功。
举例
start transaction
;
– 阿里巴巴账户减少2000
update accout set money=money-2000 where name = ‘阿里巴巴’;
– 四十大盗账户增加2000
update accout set money=money+2000 where name = ‘四十大盗’;
commit
;
MVCC即多版本并发控制。
MVCC的实现是通过保存数据在某个时间点的快照来实现的,根据事务开始的时间不同,每个事物对同一张表同一时刻看到的数据可能是不一样的
对于InnoDB来讲,聚簇索引记录中包含三个隐藏的列:
如图:首先insert语句向表t1中插入了一条数据,a字段为1,b字段为1,ROW ID也为1,事务ID假设也为1,回滚指针假设为null。当执行update t1 set b = 666 where a = 1时,大致步骤如下:
MVCC最大的好处就是读不加锁,读写不冲突
,极大增加了MySQL的并发性,通过MVCC,保证了事务ACID中的I(隔离性的特性)
多用户环境下保证数据库完整性和一致性
,当多个用户并发的存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况,若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据的一致性
在关系行数据库中,可以按照锁的粒度将数据库锁分为行级锁(InnoDB引擎)、表级锁(MYISAM引擎)和页级锁(BDB引擎)
行级锁:
页级锁:
表级锁:
MyISAM和InnoDB存储引擎使用的锁:
从锁的类别上来讲,有共享锁和排他锁
共享锁可以同时加上多个
排他锁只可以加一个,他和其他的锁排他锁、共享锁都相斥
数据库管理系统(DBMS)中的并发控制的任务时确保在多个事务同时存取数据库中统一数据时不破坏事务的隔离性行和统一性。乐观并发控制(乐观锁)和悲观并发控制(悲观锁)是并发控制主要采用的技术手段
悲观锁
乐观锁
InnoDB是基于索引来完成行锁的
例如:select * from tab where id = 1 for update;
for update 可以根据条件来完成行锁锁定,并且id是有索引键的列,如果id不是索引建那么InnoDB将完成表锁,并发将无从谈起
死锁的概念
解决死锁的方法:
串行化隔离级别:该隔离级别锁定整个范围的建,并一直持有锁,直到事务完成
分表
分库
B树它是一种多叉平衡搜索树,称为B树(有些地方写的是B-树,注意不要误读成"B减树")。
B树的命名和构造
B树的性质:
B树的生长过程是向上的(与我们之前学过的二叉树不同)
B树的插入
B+树
B+树是B-树的变形,也是一种多路搜索树,把所有的key - value 全部保存在叶子上,保存起来。为所有叶子节点增加一个链指针组成了一个链表。
B+树的搜索与B-树基本相同,查找都一样快。缺点:B+树空间使用的更多了,优点:遍历所有的key-value
变得容易了(进行链表遍历)
和B-Tree比较:
B+树更适合在区间查询的情况,更适合用作数据库索引
与hash对比:
与红黑树对比:树的高度随着数据量的增加而增加,IO代价高
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。