MySQL面试常见题目
Posted luyaran
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL面试常见题目相关的知识,希望对你有一定的参考价值。
原文地址:MySQL面试常见题目(二)
1、聚集索引和非聚集索引的区别?
-
一张表中只能存在一个聚集索引,非聚集索引不限制数量。
-
聚集索引中键值的逻辑顺序决定表中相应行的物理顺序,非聚集索引中的逻辑顺序与磁盘上行的物理顺序不同。
-
聚集索引的物理存储按索引排序,非聚集索引不按索引排序。
-
索引是通过二叉树来描述数据结构的,聚集索引的叶子节点就是数据节点,非聚集索引的叶子节点还是索引节点,只是有个指针指向对应的数据块。
2、使用聚集索引或非聚集索引的时机?
3、如何选择合适的分布式主键方案?
-
数据库自增长序列或字段。
-
UUID。
-
Redis生成ID。
-
Twitter的snowflake算法。
-
利用zookeeper生成唯一ID。
-
MongoDB的objectId。
4、事务的隔离级别有哪些?
-
读未提交(read uncommitted)。
-
读已提交(read committed)。
-
可重复读(repeatable read)。
-
串行化(serializable)。
5、mysql默认的事务隔离级别是可重复读(repeatable read)。
6、幻读、脏读、不可重复读的定义?
-
事务A、B交替执行,因为A读到B未提交的内容,致使A被B干扰到,这是脏读。
-
不可重复读:同一事务范围内,相同查询返回不同数据。
-
幻读:A查询某范围数据,并发事务B操作该范围数据且悄悄提交,A再次查询时,两次数据不一致。
7、MySQL的乐观锁和悲观锁?
a、悲观锁:当事务获得悲观锁时,任何事务都不可对数据进行操作,只能等释放。
b、乐观锁:允许多个事务同时对数据进行操作,可通过版本号机制或CAS实现。
8、高并发情况下,MySQL如何安全修改同一行数据?
首先需要保证的就是当一个线程操作当前数据时,其它线程无法对当前数据进行操作,一般有乐观锁和悲观锁两种方案。
悲观锁的思想就是当前线程操作数据时,其它线程无法访问,像如下SQL:
select * from User where name=‘123’ for update
上述SQL锁定user表中所有name为123的记录,在当前事务操作提交之前,别的线程都无法对这些数据进行操作。
乐观锁的思想就是有线程修改就先放过去进行修改操作,如果别的线程没操作过这条数据,就可修改成功,操作过就直接失败或是重试,一般用版本号机制或是CAS实现。
9、select for update有什么含义?会锁表、锁行还是?
单纯的select不会加锁,但select for update除查询外,还会加锁,而且是悲观锁,如果SQL中没有用到主键或是索引,则加表锁,反之就是行锁。
至此,本次分享就结束了,后期会慢慢补充的。
以上仅为个人观点,不一定准确,能帮到各位那是最好的。
好啦,到这里本文就结束了,喜欢的话就来个三连击吧。
以上均为个人认知,如有侵权,请联系删除。
以上是关于MySQL面试常见题目的主要内容,如果未能解决你的问题,请参考以下文章