什么是MySQL?
一个关系型数据库,开源免费。
三大范式?
第一范式所有列不可再分,
第二范式在第一范式所有非主键的全部依赖主键,
第三范式在第二范式基础上不依赖其他非主键,
数据类型有哪些?
char,varchar,int,bigint,date,text
整数类型,小数类型,日期,文本
MySQL中myisam和innodb的区别?
myisam不支持事务,读取快
innodb支持事务,增删改快
什么是索引?
索引相当于目录,指向所包含的数据。
优缺点?
优点:查询数据快,提高系统性能,
缺点:改动的数据会降低他们的速度,因为你改完后还要加入索引中
什么是索引覆盖?
如果你查询abc三个字段都建立过索引,那么他会直接在索引表中去查,不会访问元数据,如果b没有索引那就会全表扫描。
索引有哪几种类型?
主键索引-不允许有null,只能有一个,不重复
组合索引-将多普通索引组合成一个索引
唯一索引-可以有null,不重复,允许多列是唯一
普通索引-没有唯一性限制,允许有null
创建索引需要注意什么?
非空字段(null字段难以做判断),索引字段越小越好
使用索引一定能提升性能吗?
不一定,索引需要空间来存储,每当有数据修改时候,索引也会随之变动,这就比平时的多付出一些次数来修改数据。
什么是聚簇索引?
有主键的情况下主键就是聚簇索引,没有就找一个唯一索引,在没有就隐式创建,聚簇索引就是把索引和数据放在一起,找到索引就是找到数据。
非聚簇索引?
就是索引和数据分开,查询先找索引在会表查找,有时候如果你查询的字段全部是索引的话就不会回表。
索引失效?
第一最左原则,范围查询,in 查询,!=查询和函数。
什么是事务?
要么都执行,要么都不执行。
ACID?
A-原子性,所有事务要么完成,要么不完成。
C-一致性,数据是一致,a 1000 b 1000 无论他俩谁给谁转账他俩总和都是2000
I-隔离性,事务和事务之间相互隔离,互不干扰
D-持久性,对数据的修改是持久不变的
脏读、幻读、不可重复读?
脏读-读取到未提交的数据或者读取回滚数据。
幻读-读取到没有的数据,一个事务正在读取,他读取的几行数据,此时有一个事务来进行插入,在读取的时候会发现原来没有的数据。
不可重复读-一个事务读取俩次的数据不一致,俩次查询过程中有有一个事务做了更新了数据
隔离级别?
read-uncommit;读未提交
允许读取未提交的数据,引发脏读,幻读,不可重复读
read-commit;读已提交
允许读取事务完成的数据,引发幻读,不可重复读
repeatable-read;重复读
对同一数据多次读取结果一致,除非数据本身事务对其进行修改
导致幻读
serialzable;串行化
所有的事务依次执行,消耗巨大解决同时解决了脏读,幻读,不可重复读
mysql默认是repeatable-read
oracle默认是read-commit
事务隔离机制?
基于锁机制和并发调度,其中并发调度使用的是MVCC(多版本并发控制器),保存修改的旧版本信息来支持并发一致性和回滚。
锁
mysql锁理解?
当多个事务在读取数据,可能会产生数据不一致,为了保证访问顺序,这时候就会用到锁,
就拿read-uncommit来说他在读取的时候不会上共享锁,这样就会对别的事务进行修改上的排他锁冲突。
read-commit会在读操作上共享锁,但是在语句执行完就会释放,也就是为什么能解决脏读。
repeatable-read在读操作时上读锁但是他是在事务执行完成后才释放锁
串行化时最强隔离级别,他会一直持有锁,直到事务处理完毕。
行锁:读锁和写锁都是行锁,他的粒度最细的,锁冲突小,但会导致死锁,并发高,开销大加锁慢,
表锁:对于整张表加锁,冲突会加大,不会导致死锁,并发一般开销小加锁快
页锁:对于当前页加锁,会导致死锁,并发一般,加锁一般开销一般
什么是读锁?
读锁又称为共享锁,读锁可以持有多个,只能对数据进行读取。
什么是写锁?
写锁又称为排他锁,当前数据只能有一个排他锁,和读锁相斥
死锁?
俩个及多个事务在同以资源上相互占用,并想着锁住对方的资源,从而导致恶性循环。
解决升级成表锁,约定相同的顺序访问表
或者使用乐观锁
索引的解构?
b树和hash
b树会排序,hash不会排序
悲观锁乐观锁?
悲观锁,认为事务都是会冲突的,在查询的时候就上锁,直到完成。
乐观锁,认为一切都不会发生,如果发生了在进行上锁,一般就是比较并交换。
innodb的实现原理?
innodb通过聚集方式,每个表中的主键都会在innodb生成主键的b+树的根节点,叶子节点存放的是数据也包含了主键,通过查询主键的方式,先进行主键的查找然后通过查询主键所在的根节点指向的叶子节点。这是如果在创建表的时候没有主键,innodb会查看是否有非空唯一索引,有就代替主键,如果有多个,先择第一个,如果也没有,会自动生成一个不可见的row_Id。
带来问题:当row_id在每次数据库新增数据时都会+1,一旦超过了2的48-1,后你通过row_id获取到0,发生了主键冲突。