MySQL最全⾯试⼋股⽂
1.Mysql中事务的四⼤特性:
原⼦性(Atomicity)、⼀致性(Consistent)、隔离性(Isalotion)、持久性(Durable),简称为ACID。
原⼦性:事务的原⼦性操作,对数据的操作要么全部成功,要么全部失败,实现事务的原⼦性是基于事务的Redo/Undoh机制。
⼀致性:执⾏事务的前后状态⼀致,理解为数据的⼀致性。
隔离性:事务之间互相隔离,不受影响,与事务的隔离级别有关。
持久性:事务提交之后,事务的状态会被持久化到数据库中。
2.Redo/Undo机制:
Redo log: 可以⽤来恢复未写⼊数据库中但是事务已经成功提交的的数据。(某⼀时刻,我事务已经提交了,刚要写到数据库,结果数据库挂了,这时候数据库重启的时候就会通过Redo log来进⾏数据的恢复)
Undo log: ⽤来记录数据被修改前的值,主要⽤于事务执⾏失败后进⾏回滚。
3.事务的隔离级别:
1.读未提交(READ UNCOMMITTED)、产⽣脏读问题。
vb编程软件手机版下载2.读提交 (READ COMMITTED)、解决了脏读的问题,出现了不可重复读,即在⼀个事务任意时刻读到的数据可能不⼀样,可能会受到其它事务对数据修改提交后的影响,⼀般是对于update的操作。
3.可重复读 (REPEATABLE READ)、解决了之前不可重复读和脏读的问题,但是由带来了幻读的问题,幻读⼀般是针对insert操作。
4.串⾏化 (SERIALIZABLE)、
脏读问题: 开启⼀个事物A对数据进⾏了修改,⽽此次修改并没有提交到数据库中,这时另⼀个事务B也访问了这个数据,当且读到事务A 修改后未提交的数据,叫做脏读。
不可重复读问题: 指在⼀个事务内,多次读同⼀数据,结果不⼀样。事务A开启了事务读取了⼀条数据,未提交事务,这时候,事务B也开启了事务,
并修改了这条数据,然后提交了事务,事务A再次读取这条数据的时候,产⽣了不⼀致的结果。
举例:
时间A事务B事务
1开启事务A
2第⼀次读取⼀条数据:num=1000
3开启事务B
4读取同⼀条数据:num=1000,num+100
5num=1100,提交事务B
6第⼆次读取:num=1100,产⽣脏读
幻读: 是指当事务不是独⽴执⾏时发⽣的⼀种现象,例如第⼀个事务对⼀个表中的数据进⾏了修改,这种修改涉及到表中的全部数据⾏。同时,第⼆个事务也修改这个表中的数据,
这种修改是向表中插⼊⼀⾏新数据。那么,以后就会发⽣操作第⼀个事务的⽤户发现表中还有没有修改的数据⾏,就好象发⽣了幻觉⼀样。
javabean的功能什么例如:
时间A事务B事务
1开启事务A
2第⼀次查询表中数据共1000条:
3开启事务B
4向表中插⼊⼀条数据
5提交事务B
5提交事务B 时间A事务B事务
6第⼆次查询表中数据共1001条:产⽣幻读
不可重复读的重点是修改:
同样的条件,你读取过的数据,再次读取出来发现值不⼀样了
幻读的重点在于新增或者删除:
同样的条件,第 1 次和第 2 次读出来的记录数不⼀样
第⼀类丢失更新问题:
A事务撤销时,把已经提交的B事务的更新数据覆盖了。
例如:
时间A事务B事务
1开启事务A
2开启事务B三角函数值大全表图 表格
3查询数据num=1000
4查询数据num=1000
5修改:num+100
6num=1100,提交事务B
7修改:num-100
8修改失败,回滚事务。
最终回滚的结果是num=1000,A事务的回滚造成了事务B提交的数据丢失了。
第⼆类丢失更新问题:
A事务覆盖B事务已经提交的数据,造成B事务所做的操作丢失
时间A事务B事务
1开启事务A
2开启事务B
3查询数据num=1000
4查询数据num=1000
5修改:num+100
6num=1100,提交事务B
7修改:num-100
8提交事务:num=900
最终num的结果为900,A事务的提交覆盖了B事务,造成了B事务的数据丢失
数据库默认隔离级别:可重复读 (REPEATABLE READ),隔离级别越⾼,并发性越低
隔离级别脏读不可重复读幻读第⼀类更新丢失第⼆类更新丢失读未提交√√√×√
读提交×√√×√可重复读××√××
串⾏化×××××
隔离级别脏读不可重复读幻读第⼀类更新丢失第⼆类更新丢失
4.Mysql的锁机制:
mysql默认存储引擎是InnoDB,InnoDB与Myisam相⽐,InnoDB⽀持事物,⽀持多种锁机制,有⾏锁和表锁,Myisam只⽀持表锁,且不⽀持事物
数据库实现事务隔离的⽅式有两种:
1.在读取数据前对其进⾏加锁,阻⽌其它事务对其进⾏修改,称为LBCC。
2.另⼀种是不加锁,通过⼀定机制⽣成⼀个数据请求时间点的⼀致性数据快照,并⽤这个快照来提供⼀定级别的⼀致性读取 ,称为
MVCC(多版本)
分享锁/读锁(Shared Locks)
共享锁是多个事务对于同⼀数据可以共享⼀把锁,都能访问到数据,但是只能读不能修改。普通查询不会加任何锁,⼿动加共享锁使⽤select … lock in share mode语句。
**排他锁/写锁(Exclusive Locks) **
排他锁两个事物不能共存。如⼀个事务获取了⼀个数据⾏的排他锁,其他事务就不能再获取该⾏的其他锁,包括共享锁和排他锁,但是获取排他锁的事务是可以对数据就⾏读取和修改,所以排他锁会阻塞其他事物的读操作和写操作,直到释放排他锁。在 InnoDB
中,update,delete,insert都会⾃动给涉及到的数据加上排他锁,select查询语句可使⽤select …for update加排他锁,事物结束或者rollback/commit就会释放锁。
意向共享锁:
事务打算给数据⾏加⾏共享锁,事务在给⼀个数据⾏加共享锁前必须先取得该表的IS锁,反之亦然。
意向排他锁
事务打算给数据⾏加⾏排他锁,事务在给⼀个数据⾏加排他锁前必须先取得该表的IX锁,反之亦然。意向共享锁和意向排他锁都是mysql⾃⾝管理,⼈为⼲预不了。
间隙锁
间隙锁是⼀个在索引记录之间的间隙上的锁。
间隙锁的作⽤:保证某个间隙内的数据在锁定情况下不会发⽣任何变化。
间隙锁的条件:索引或者是⾮唯⼀索引时产⽣间隙锁,搜索条件⾥有多个查询条件(即使每列都有唯⼀索引),也是会有间隙锁的。
当id列上没有索引时,SQL会⾛聚簇索引的全表扫描进⾏过滤,由于过滤是在MySQL Server层⾯进⾏的。因此每条记录(⽆论是否满⾜条件)都会被加上X锁。但是,为了效率考量,MySQL做了优化,对于不满⾜条件的记录,会在判断后放锁,最终持有的,是满⾜条件的记录上的锁。但是不满⾜条件的记录上的加锁/放锁动作是不会省略的。所以在没有索引时,不满⾜条件的数据⾏会有加锁⼜放锁的耗时过程。
间隙的范围:根据检索条件向下寻最靠近检索条件的记录值A作为左区间,向上寻最靠近检索条件的记录值B作为右区间,即锁定的间隙为(A,B)。
例如:
select * from t where id = 6 for update (id列没有建⽴索引或者是⾮唯⼀索引)
表中id为:1,2,3,4,5,6,6,6,9
use在键盘哪里那么间隙的区间就是(5,9),如果再5到9之间插⼊数据,插⼊程序就会被阻塞,因为已经加了间隙锁,如果在查询的过程中没有加锁,那么就会产⽣未提交的事务两次读取到id=6的数据是不⼀致的,产⽣幻读问题。
表锁
表锁时开销最⼩的,表锁会锁定整张表,⼀个⽤户在对标进⾏写,插⼊,删除,更新等操作前,需要先获取到写锁,这会阻塞其他 ⽤户对该表的所有读写操作,只有没有写锁时,其他⽤户才可以获得读锁,读锁之间时不相互阻塞的,表锁⽀持某些类型的并发写操作,另外写锁也⽐读锁有更⾼优先级,⼀个械所请求可能会插⼊到读锁队列的前⾯,读锁不可以插到写锁的前⾯,服务器会为例如alter table之类的语句使⽤表锁,⽽忽略存储引擎锁机制
⾏锁
⾏级锁可以最⼤程度⽀持并发处理,同时开销也是最⼤的锁开销,在innoDB ,XtraDB 实现了⾏级锁,⾏级锁旨在存储引擎层实现,⽽服务层没有实现,服务层完全不了解存储引擎中锁的实现,所有的存储引擎都以⾃⼰的⽅式实现了锁的机制
例如:SELECT * from city where id = “1” lock in share mode;
由于对于city表中,id字段为主键,就也相当于索引。执⾏加锁时,会将id这个索引为1的记录加上锁,那么这个锁就是⾏锁。
5.Mysql的索引:
索引⽅式
索引MyISAM引擎InnoDB引擎Memory引擎
B-Tree索引⽀持⽀持⽀持
HASH索引不⽀持不⽀持⽀持
R-Tree索引⽀持不⽀持不⽀持
Full-text索引⽀持暂不⽀持(现在⽀持)不⽀持
1.BTREE:
多路⾃平衡搜索树:Innodb的存储引擎以page为单位,page是管理磁盘的最⼩单位,默认16k,⼀个page中有多个磁盘,如果page中每个数据都有助于定位其它数据的位置,那么将会减少磁盘IO,加快效率,BTREE的出现就解决了这个问题,
2.B+TREE:
对BTREE做了优化,减⼩了树的深度,减⼩了检索次数,提升效率,
具体区别不做赘述,可以研究下各种Tree的数据结构,
这个博⽂讲的BTREE和B+TREE就很详细:
3.HASH :
hash是key—>value形式的数据结构,⾮常适合做索引,hash索引可以⼀次定位,不需要像树形索引那样逐层查,因此具有极⾼的效率。但是Hash索引也有缺点。
1.Hash 索引仅仅能满⾜"=",“IN"和”<=>"查询,不能使⽤范围查询;Hash 索引⽐较的是进⾏ Hash 运算之后的 Hash 值,所以它只能⽤于等值的过滤,不能⽤于基于范围的过滤,因为经过相应的 Hash 算法处理之后的 Hash 值的⼤⼩关系,并不能保证和Hash运算前完全⼀样。
2.Hash 索引⽆法被⽤来避免数据的排序操作;由于 Hash 索引中存放的是经过 Hash 计算之后的 Hash 值,⽽且Hash值的⼤⼩关系并不⼀定和 Hash 运算前的键值完全⼀样,所以数据库⽆法利⽤索引的数据来避免任何排序运算;
3.Hash 索引不能利⽤部分索引键查询;对于组合索引,Hash 索引在计算 Hash 值的时候是组合索引键合并后再⼀起计算 Hash 值,⽽不是单独计算 Hash 值,所以通过组合索引的前⾯⼀个或⼏个索引键进⾏查询的时候,Hash 索引也⽆法被利⽤。
4.Hash 索引在任何时候都不能避免表扫描;Hash 索引是将索引键通过 Hash 运算之后,将 Hash运算
结果的 Hash 值和所对应的⾏指针信息存放于⼀个 Hash 表中,由于不同索引键存在相同 Hash 值,所以即使取满⾜某个 Hash 键值的数据的记录条数,也⽆法从 Hash 索引中直接完成查询,还是要通过访问表中的实际数据进⾏相应的⽐较,并得到相应的结果。
5.Hash 索引遇到⼤量Hash值相等的情况后性能并不⼀定就会⽐B-Tree索引⾼;对于选择性⽐较低的索引键,如果创建 Hash 索引,那么将会存在⼤量记录指针信息存于同⼀个 Hash 值相关联。这样要定位某⼀条记录时就会⾮常⿇烦,会浪费多次表数据的访问,⽽造成整体性能低下
4.FULLTEXT:
全⽂索引的出现是为了解决WHERE name LIKE “%word%"这类针对⽂本的模糊查询效率较低的问题。
全⽂索引,⽬前只有MyISAM引擎⽀持。其可以在CREATE TABLE ,ALTER TABLE ,CREATE INDEX 使⽤,不过⽬前只有 CHAR、VARCHAR ,TEXT 列上可以创建全⽂索引。
5.RTREE:
RTREE在mysql很少使⽤,仅⽀持geometry数据类型,⽀持该类型的存储引擎只有MyISAM、BDb、InnoDb、NDb、Archive⼏种,相对于BTREE,RTREE的优势在于范围查
索引类型
普通索引:仅加速查询
唯⼀索引:加速查询 + 列值唯⼀(可以有null)
主键索引:加速查询 + 列值唯⼀(不可以有null)+ 表中只有⼀个
组合索引:多列值组成⼀个索引,专门⽤于组合搜索,其效率⼤于索引合并
全⽂索引:对⽂本的内容进⾏分词,进⾏搜索
⼈家菜鸟已经写的很好了,我就不瞎总结了:
6.视图:
视图是⼀个虚拟表,它可以像表⼀样进⾏curd操作,视图是虚拟表,本⾝不存储数据,⽽是按照指定的⽅式进⾏查询,其本质就是⼀条有名字的select语句:⼀到多张表的内容。视图的列来⾃于⼀个表或多个表,可以理解为⼀个复杂查询的sql语句设置了⼀个别名,所以视图不可以和表名重名,多⽤作查询,⼀般不会通过视图去修改数据。
优点:限制数据库的访问,简化查询,数据独⽴性,对同⼀数据的不同体现。
创建视图 create view
例如:两个表的关联查询可以创建成⼀个视图
create view view_test as(select s.id as id,s.name as name,g.age as age from user s,user_detail g where s.id=g.id);
视图运⽤
使⽤视图和使⽤表完全⼀样
修改视图 CREATE OR REPLACE VIEW
修改视图:
CREATE OR REPLACE VIEW view_test
AS
SELECT*FROM user_detail
网站查询seo
mysql面试题acidWHERE age >=18;
视图与数据变更
源表的数据变化,数据中的数据也会变化
可以通过视图插⼊数据,但是只能基于⼀个基础表进⾏插⼊,不能跨表更新数据,不建议在视图更新数据。
如果在创建视图的时候制定了“WITH CHECK OPTION”,那么更新数据时不能插⼊或更新不符合视图限制条件的记录。
create view view_test as SELECT*FROM user_detail
WHERE age >=18WITH CHECK OPTION;
那么如果在视图中插⼊⼀条age=12的数据,会提⽰错误:CHECK OPTION FAILED,因为视图限制了视图⼤于等于18。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论