Mysql数据库常见面试题

1.事务四大特性

    1、原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位。
    2、一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 。比如AB转账,不可能A扣了钱,B却没收到。
    3、隔离性(Isolation):同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。
    4、持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。

2.数据库隔离级别

一、事务的并发问题
  1、脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据
  2、不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。
  3、幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。
  小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表
 二、隔离级别总结
   1READ UNCOMMITTED(读未提交)
    2READ COMMITTED(读提交)
    3REPEATABLE READ(可重复读)
    4SERIALIZABLE(串行化)
隔离级别脏读不可重复读幻读
read uncommitted不可解决不可解决不可解决
read committed可解决不可解决不可解决
repeatable read可解决可解决不可解决
serializable可解决可解决可解决

3.MYSQL的两种存储引擎区别(事务、锁级别等等),各自的适用场景

引擎特性
MYISAM不支持事务,表锁,插入数据时,锁定整个表,查表总行数时,不需要全表扫描
INNODBc支持外键,行锁,查表总行数时,全表扫描

4.索引有B+索引和hash索引

索引区别
Hashhash索引,等值查询效率高,不能排序,不能进行范围查询
B+存储指向真正数据行的指针

5.聚集索引和非聚集索引

索引区别
聚集索引数据按索引顺序存储,中子结点存储真实的物理数据
非聚集索引存储指向真正数据行的指针

6.索引的优缺点,什么时候使用索引,什么时候不能使用索引

1、索引最大的好处是提高查询速度,
2、缺点是更新数据时效率低,因为要同时更新索引
3、对数据进行频繁查询进建立索引,如果要频繁更改数据不建议使用索引。

7.InnoDB索引和MyISAM索引的区别

1、一是主索引的区别,InnoDB的数据文件本身就是索引文件。而MyISAM的索引和数据是分开的。
2、二是辅助索引的区别:InnoDB的辅助索引data域存储相应记录主

8.索引的底层实现(B+树,为何不采用红黑树,B树)重点

区别
红黑树增加,删除,红黑树会进行频繁的调整,来保证红黑树的性质,浪费时间
B树也就是B-树B树,查询性能不稳定,查询结果高度不致,每个结点保存指向真实数据的指针,相比B+树每一层每屋存储的元素更多,显得更高一点。
B+树B+树相比较于另外两种树,显得更矮更宽,查询层次更浅

9.B+树的实现

一个m阶的B+树具有如下几个特征:
1、有k个子树的中间节点包含有k个元素(B树中是k-1个元素),每个元素不保存数据,只用来索引,所有数据都保存在叶子节点。
2、所有的叶子结点中包含了全部元素的信息,及指向含这些元素记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。
3、所有的中间节点元素都同时存在于子节点,在子节点元素中是最大(或最小)元素

10.为什么使用B+Tree

1、索引查找过程中就要产生磁盘I/O消耗,主要看IO次数,和磁盘存取原理有关。
2、根据B-Tree的定义,可知检索一次最多需要访问h个节点。数据库系统的设计者巧妙利用了磁盘预读原理,将一个节点的大小设为等于一个页,这样每个节点只需要一次I/O就可以完全载入
3、利用了局部性原理与磁盘预读

11.Sql的优化

1、sql尽量使用索引,而且查询要走索引
2、对sql语句优化
   1)子查询变成left join
   2)limit 分布优化,先利用ID定位,再分页
   3)or条件优化,多个or条件可以用union all对结果进行合并             (union all结果可能重复)
   4)不必要的排序
   5)where代替having,having 检索完所有记录,才进行过滤
   6)避免嵌套查询
   7)对多个字段进行等值查询时,联合索引

12.索引最左前缀问题一级目录

如果对三个字段建立联合索引,如果第二个字段没有使用索引,第三个字段也使用不到索引了

13.索引分类,索引失效条件

索引类型概念
普通索引最基本的索引,没有任何限制
唯一索引与"普通索引"类似,不同的就是:索引列的值必须唯一,但允许有空值。
主键索引它是一种特殊的唯一索引,不允许有空值。
全文索引针对较大的数据,生成全文索引很耗时好空间。
组合索引为了更多的提高mysql效率可建立组合索引,遵循”最左前缀“原则
失效条件
1、条件是or,如果还想让or条件生效,给or每个字段加个索引
2、like查询,以%开发
3、内部函数
4、对索引列进行计算
5、is null不会用,is not null 会用

14.数据库的主从复制

复制方式操作
异步复制默认异步复制,容易造成主库数据和从库不一致,一个数据库为Master,一个数据库为slave,通过Binlog日志,slave两个线程,一个线程去读master binlog日志,写到自己的中继日志一个线程解析日志,执行sql,master启动一个线程,给slave传递binlog日志
半同步复制只有把master发送的binlog日志写到slave的中继日志,这时主库,才返回操作完成的反馈,性能有一定降低
并行操作slave 多个线程去请求binlog日志

15.long_query怎么解决

设置参数,开启慢日志功能,得到耗时超过一定时间的sql

16.varchar和char的使用场景

类型使用场景
varchar字符长度经常变的
char用字符长度固定的

17.数据库连接池的作用

1、维护一定数量的连接,减少创建连接的时间
2、更快的响应时间
3、统一的管理

18.分库分表,主从复制,读写分离

1、读写分离,读从库,写主库
2、spring配置两个数据库,通过AOP(面向切面编程),在写或读方法前面进行判断得到动态切换数据源。

19.数据库三范式

级别概念
1NF属性不可分
2NF非主键属性,完全依赖于主键属性
3NF非主键属性无传递依赖

20.关系型数据库和非关系型数据库区别

关系型数据库

优点

1、容易理解:二维表结构是非常贴近逻辑世界一个概念,关系模型相对网状、层次等其他模型来说更容易理解;

2、使用方便:通用的SQL语言使得操作关系型数据库非常方便;
3、易于维护:丰富的完整性(实体完整性、参照完整性和用户定义的完整性)大大减低了数据冗余和数据不一致的概率;
4、支持SQL,可用于复杂的查询。
5.支持事务

缺点
1、为了维护一致性所付出的巨大代价就是其读写性能比较差;
2、固定的表结构;
3、不支持高并发读写需求;
4、不支持海量数据的高效率读写

非关系型数据库

1、使用键值对存储数据;
2、分布式;
优点
无需经过sql层的解析,读写性能很高
基于键值对,数据没有耦合性,容易扩展
存储数据的格式:nosql的存储格式是key,value形式
缺点
不提供sql支持

21.数据库中join的left join , inner join, cross join

1、以AB两张表为例
   A left join B
   选出A的所有记录,B表中没有的以null 代替
   right join 同理

2、inner join
   A,B有交集的记录

3、cross join (笛卡尔积)
   A中的每一条记录和B中的每一条记录生成一条记录
   例如A中有4条,B中有4条,cross join 就有16条记录

22.有哪些锁,select时怎么加排它锁

概念
乐观锁自己实现,通过版本号
悲观锁共享锁,多个事务,只能读不能写,加 lock in share mode
排它锁一个事务,只能写,for update
行锁排作用于数据行
表锁作于用表

23.死锁怎么解决

找到进程号,kill 进程

24.最左匹配原则

最左匹配原则是针对索引的
举例来说:两个字段(name,age)建立联合索引,如果where age=12这样的话,是没有利用到索引的,
这里我们可以简单的理解为先是对name字段的值排序,然后对age的数据排序,如果直接查age的话,这时就没有利用到索引了,
查询条件where name=‘xxx’ and age=xx 这时的话,就利用到索引了,再来思考下where age=xx and name=’xxx‘ 这个sql会利用索引吗,
按照正常的原则来讲是不会利用到的,但是优化器会进行优化,把位置交换下。这个sql也能利用到索引了

25.Union与Union All的区别?

类型区别
Union对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序;
Union All对两个结果集进行并集操作,包括重复行,不进行排序;

26.Mysql数据库,视图与表的区别?

  1、表是作为数据库存储数据的一种数据结构,视图是从已存在表上抽出逻辑相关的数据集合,视图是已经编译好的sql语句。
  2、表有实际的物理记录,视图没有,表只有物理空间而视图不占用物理空间,视图只是逻辑概念的存在,表可以及时对它进行修改,但视图只能由创建的语句来修改,表是内模式,视图是外模式,视图是查看数据表的一种方法,可以查询数据表中某些字段构成的数据,只是一些SQL语句的集合。从安全的角度说,视图可以不给用户接触数据表,从而不知道表结构,视图的建立和删除只影响视图本身,不影响对应的基本表。

27.什么叫视图?游标是什么?

视图:是一种虚拟的表,具有和物理表相同的功能。可以对视图进行增,改,查,操作,视图通常是有一个表或者多个表的行或列的子集。对视图的修改不影响基本表。它使得我们获取数据更容易,相比多表查询。
游标:是对查询出来的结果集作为一个单元来有效的处理。游标可以定在该单元中的特定行,从结果集的当前行检索一行或多行。可以对结果集当前行做修改。一般不使用游标,但是需要逐条处理数据的时候,游标显得十分重要。

28.Mysql有关权限的表都有哪几个

MySQL服务器通过权限表来控制用户对数据库的访问,权限表存放在mysql数据库里,由mysql_install_db脚本初始化。这些权限表分别user,db,table_priv,columns_priv和host。下面分别介绍一下这些表的结构和内容:

user权限表:记录允许连接到服务器的用户帐号信息,里面的权限是全局级的。

db权限表:记录各个帐号在各个数据库上的操作权限。

table_priv权限表:记录数据表级的操作权限。

columns_priv权限表:记录数据列级的操作权限。

host权限表:配合db权限表对给定主机上数据库级操作权限作更细致的控制。这个权限表不受GRANTREVOKE语句的影响。

29.触发器的作用?

触发器是一中特殊的存储过程,主要是通过事件来触发而被执行的。它可以强化约束,来维护数据的完整性和一致性,可以跟踪数据库内的操作从而不允许未经许可的更新和变化。可以联级运算。如,某表上的触发器上包含对另一个表的数据操作,而该操作又会导致该表触发器被触发。

30.drop,delete与truncate的区别

  • drop直接删掉表 。

  • truncate删除表中数据,再插入时自增长id又从1开始 。

  • delete删除表中数据,可以加where字句。


1DELETE语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存以便进行进行回滚操作。TRUNCATE TABLE 则一次性地从表中删除所有的数据并不把单独的删除操作记录记入日志保存,删除行是不能恢复的。并且在删除的过程中不会激活与表有关的删除触发器。执行速度快。
2) 表和索引所占空间。当表被TRUNCATE 后,这个表和索引所占用的空间会恢复到初始大小,而DELETE操作不会减少表或索引所占用的空间。drop语句将表所占用的空间全释放掉。
3) 一般而言,drop > truncate > delete
4) 应用范围。TRUNCATE 只能对TABLEDELETE可以是table和view
5TRUNCATEDELETE只删除数据,而DROP则删除整个表(结构和数据)。
6) truncate与不带where的delete :只删除数据,而不删除表的结构(定义)drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger)索引(index);依赖于该表的存储过程/函数将被保留,但其状态会变为:invalid。
7delete语句为DML(data maintain Language),这个操作会被放到 rollback segment中,事务提交后才生效。如果有相应的 tigger,执行的时候将被触发。
8) truncate、drop是DLL(data define language),操作立即生效,原数据不放到 rollback segment中,不能回滚。
9) 在没有备份情况下,谨慎使用 drop 与 truncate。要删除部分数据行采用delete且注意结合where来约束影响范围。回滚段要足够大。要删除表用drop;若想保留表而将表中数据删除,如果于事务无关,用truncate即可实现。如果和事务有关,或老师想触发trigger,还是用delete10) Truncate table 表名 速度快,而且效率高,因为: 
11TRUNCATE TABLE 删除表中的所有行,但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。如果想保留标识计数值,请改用 DELETE。如果要删除表定义及其数据,请使用 DROP TABLE 语句。
12) 对于由 FOREIGN KEY 约束引用的表,不能使用 TRUNCATE TABLE,而应使用不带 WHERE 子句的 DELETE 语句。由于 TRUNCATE TABLE 不记录在日志中,所以它不能激活触发器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值