数据库
2020-02-24 10:38:00 0 举报
AI智能生成
mysql常见面试题
作者其他创作
大纲/内容
数据库中的事物
特点
A:原⼦性(Atomicity) 事务中的操作要么都不做,要么就全做。
C:⼀致性(Consistency) 事务执⾏的结果必须是从数据库从⼀个⼀致性状态转换到另⼀ 个⼀致性状态。
I:隔离性(Isolation) ⼀个事务的执⾏不能被其他事务⼲扰
D:持久性(Durability) ⼀个事务⼀旦提交,它对数据库中数据的改变就应该是永久性的
事务运⾏的三种模式:
1.⾃动提交事务 每条单独的语句都是⼀个事务,每个语句都隐含⼀个commit
2.显式事务 以begin transaction 开始,以commit 或 rollback 结束。
3.隐性事务 在前⼀个事务完成时,新事务隐式启动,但每个事务仍以commit或rollback显示结束
存储引擎
InnoDB
为什么推荐使⽤⾃增ID作为主键?
行级锁的实现
⾏级锁有⼏种
Innodb默认隔离级别
Repeatable Read(可重读
MyISAM
区别
MySQL中⾃增主键, 删除数据重启后插⼊数据的主键值
MySql的主从实时备份同步的配置,以及原理(从库读主库的binlog), 读写分离
主从同步?*
主从的好处
⽔平扩展数据库的负载能⼒。
容错,⾼可⽤。Failover(失败切换)/High Availability
数据备份。
主从原理
MySQL读写分离原理
读写分离就是只在主服务器上写,只在从服务器上读
主数据库处理事务性查询,⽽从数据库处理select查询
数据库复制被⽤来把事务性查询导致的变更同步到集群中的从数据库
数据库的隔离级别
1.读未提交(Read Uncommitted) 引发脏读(读取了未提交的数据)
2.读已提交(Read Committed) 这是⼤多数数据库系统默认的隔离级别,但不是MySQL默认的 只能看⻅已经提交事务所做的改变 引发不可重复读,不可重读读意味着我们同⼀事 务执⾏完全相同的select语句时可能看到不⼀样的结果。
导致的原因
(1)有⼀个交叉的事务有新的commit,导致了数据的改变
(2)⼀个数据库被多个实例操作时,同⼀事务的其他实例在该实例处理其间可能会有新的commit 多个commit提交时,只读⼀次出现结果不⼀致
3.可重复读(Repeatable Read) 这是MySQL的默认事务隔离级别 它确保同⼀事务的多个 实例在并发读取数据时,看到同样的数据⾏
此级别可能出现的问题--幻读(Phantom Read),当⽤户读取某⼀范围的数据⾏时,另⼀ 个事务⼜在该范围内插⼊了新⾏,当⽤户再读取该范围的数据⾏时,会发现有新的“幻影”⾏ InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion ConcurrencyControl)机制解决了该问题
4.可串⾏化(Serializable) 这是最⾼的隔离级别 它通过强制事务排序,使之不可能相互从⽽解决幻读问题。简⾔之,它在每个读的数据⾏上加上共享锁。 可能导致⼤量的 超时现象和锁竞争
mvcc机制
不考虑隔离性的并发访问问题
1)脏读:B事务读取到了A事务尚未提交的数据 ---- 要求B事务要读取A事 务提交的数据
2)不可重复读:⼀个事务中 两次读取的数据的内容不⼀致 --- 要求的是⼀个事务中多次读取时数据是⼀致的 — unpdate
3)幻读/虚读:⼀个事务中 两次读取的数据的数量不⼀致 --- 要求在⼀个事务多 次读取的数据的数量是⼀致的 --insert delete
数据库索引
数据库索引的实现
索引类型
聚集索引
⾮聚集索引
聚集索引就是以主键创建的索引。* ⾮聚集索引就是以⾮主键创建的索引。*
区别
覆盖索引
索引的数据结构
b+树
优点
与b树的区别
为什么用b树而不用红黑树
索引的优化
只要列中含有NULL值, 就最好不要在此例设置索引,复合索引如果有
NULL值,此列在使用时也不会使用索引
尽量使用短索引,如果可以,应该制定一个前缀长度.
对于经常在where子句使用的列,最好设置索引
对于有多个列where或者order by子句的,应该建立复合索引
对于like语句,以%或者'-'开头的不会使用索引,以%结尾会使用索引■尽量不要在列上进行运算(函数操作和表达式操作)
尽量不要使用not in和<>操作
索引的失效
1、如果条件中有or,即使其中有部分条件带索引也不会使用(这也是为什么尽量少用or的原因),例子中 id 无索引注意:要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引
2、存在索引列的数据类型隐形转换,则用不上索引,比如列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引(就是什么类型我们就用什么类型去查询,不然索引会失效)
3、where 子句里对索引列上有数学运算,用不上索引
4、like的模糊查询以%开头,索引失效
5、存在NULL值条件我们在设计数据库表时,应该尽力避免NULL值出现,如果非要不可避免的要出现NULL值,也要给一个DEFAULT值,数值型可以给0、-1之类的, 字符串有时候给空串有问题,就给一个空格或其他。如果索引列是可空的,是不会给其建索引的,索引值是少于表的count(*)值的,所以这种情况下,执行计划自然就去扫描全表了。
什么情况下不推荐使用
1) 数据唯一性差(一个字段的取值只有几种时)的字段不要使用索引
2) 频繁更新的字段不要使用索引比如logincount登录次数,频繁变化导致索引也频繁变化,增大数据库工作量,降低效率。
3) 字段不在where语句出现时不要添加索引,如果where后含IS NULL /IS NOT NULL/ like ‘%输入符%’等条件,不建议使用索引只有在where语句出现,mysql才会去使用索引
4) where 子句里对索引列使用不等于(<>),使用索引效果一般
锁
行锁表锁区别
什么是间隙锁,什么时候上间隙锁
当我们⽤范围条件⽽不是相等条件检索数据,并请求共享或排他锁时,InnoDB会给符合条 件的已有数据记录的索引项加锁;对于键值在条件范围内但并不存在的记录,叫做“间隙 (GAP)”,InnoDB也会对这个“间隙”加锁,这种锁机制就是所谓的间隙锁(Next-Key 锁)。
加锁时机InnoDB使⽤间隙锁的⽬的,⼀⽅⾯是为了防⽌幻读,以满⾜相关隔离级别的要求,对于上 ⾯的例⼦,要是不使⽤间隙锁,如果其他事务插⼊了empid⼤于100的任何记录,那么本事 务如果再次执⾏上述语句,就会发⽣幻读;另外⼀⽅⾯,是为了满⾜其恢复和复制的需 要。有关其恢复和复制对锁机制的影响,以及不同隔离级别下InnoDB使⽤间隙锁的情况, 在后续的章节中会做进⼀步介绍。InnoDB除了通过范围条件加锁时使⽤间隙锁外,如果使⽤相等条件请求给⼀个不存在的记 录加锁,InnoDB也会使⽤间隙锁!
写锁,读锁
写锁,又称排它锁。当事务1对某个数据对象加写锁,则其他事务都不能再对此数据对象加任何锁。
读锁,又称共享锁。当事务1对某个数据对象加读锁,则其他事务只能对此数据对象加读锁,不能加写锁。直到事务1释放这个锁。
连接⽅式
内连接(inner join)
外连接(left join、right join)
0 条评论
下一页