MySQL面试题

Posted 小坏蛋至尊宝

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL面试题相关的知识,希望对你有一定的参考价值。

MySQL

  1. 高性能sql编写/ SQL语句如何调优
  1. 查询SQL尽量不要使用select *,而是select具体字段
  2. 如果知道查询结果只有一条或者只要最大/最小一条记录,建议用limit 1 (如果查询字段上有唯一索引,可以不加limit 1)
  3. 尽量避免在where子句中使用or来连接条件(用or可能会使索引失效,从而全表扫描)
  4. 优化limit分页
  5. like语句: 把%放前面,并不走索引,% 放关键字后面,还是会走索引的
  6. 使用where条件限定要查询的数据,避免返回多余的行
  7. 避免在索引列上使用mysql的内置函数
  8. 避免在 where 子句中对字段进行表达式操作,这将导致系统放弃使用索引而进行全表扫
  9. Inner join 、left join、right join,优先使用Inner join,如果是left join,左边表结果尽量小
  10. 避免在 where 子句中使用!=或<>操作符
  11. 使用联合索引时,注意索引列的顺序,一般遵循最左匹配原则
  12. 对查询进行优化,应考虑在 where 及 order by 涉及的列上建立索引,尽量避免全表扫描
  13. 如果插入数据过多,考虑批量插入
  14. 适当的时候,使用覆盖索引
  15. 使用explain 分析你SQL的计划

  1. 数据库的死锁问题

一个用户A 访问表A(锁住了表A),然后又访问表B;另一个用户B 访问表B(锁住了表B),然后企图访问表A;这时用户A由于用户B已经锁住表B,它必须等待用户B释放表B才能继续,同样用户B要等用户A释放表A才能继续,这就死锁就产生了。

用户A查询一条纪录,然后修改该条纪录;这时用户B修改该条纪录,这时用户A的事务里锁的性质由查询的共享锁企图上升到独占锁,而用户B里的独占锁由于A 有共享锁存在所以必须等A释放掉共享锁,而A由于B的独占锁而无法上升的独占锁也就不可能释放共享锁,于是出现了死锁。

如果在事务中执行了一条不满足条件的update语句,则执行全表扫描,把行级锁上升为表级锁,多个这样的事务执行后,就很容易产生死锁和阻塞。

  1. 索引建立准则
  1. 选择唯一性索引
  2. 为经常需要排序、分组和联合操作的字段建立索引
  3. 为常作为查询条件的字段建立索引
  4. 限制索引的数目
  5. 尽量使用数据量少的索引
  6. 尽量使用前缀来索引
  7. 删除不再使用或者很少使用的索引
  8. 最左前缀匹配原则,非常重要的原则。
  9. =和in可以乱序。
  10. 尽量选择区分度高的列作为索引。
  11. 索引列不能参与计算,保持列“干净”。
  12. 尽量的扩展索引,不要新建索引。
  13. 当单个索引字段查询数据很多,区分度都不是很大时,则需要考虑建立联合索引来提高查询效率
  1. 数据库分为哪两种

传统关系形数据库与非关系型数据库

  1. 都知道什么数据库

MySQL,Oracle,SQLServer,Redis,Mongo等

  1. 基础CURD,连接查询,分组查询,子查询

自己复习

  1. mysql分页关键词oracle分页关键词

mysql: limit 偏移量  查询数据条数

oracle: rownum,三层子查询, 只能小于,不能大于

  1. mysql的去重函数

distinct

  1. 数据库外键创建方式

foreign key(col) references 被引用表(被引用字段)

  1. MySQL事务

set auto_commit = false , commit ,rollback ,

savepoint,rollback to

  1. 聚合函数有哪些?

count, sum , max , min , avg 等等

  1. 左链接,右连接,全连接,内连接的区别

inner join: 两张表中都满足连接条件的部分数据

left join : inner join + 左表多出的数据(表部分补NULL)

right join: inner join + 右表多出的数据(左表部分补NULL)

full join: 笛卡尔积

  1. 什么时候索引会失效

详见MySQL 第一题

  1. 数据库索引的作用?

数据库索引是为了增加查询速度而对表字段附加的一种标识

  1. mysql数据库里的对象

触发器(Trigger)、表(Table)、视图(View)、存储过程(StoredProcedure)、索引(Index)、缺省值(Default)、图表(Diagram)、用户(User)、规则(Rule)等

  1. 怎么查看数据库字符长度

char_length 函数 , length 函数查看字节长度

  1. mysql引擎有哪些?有什么区别

MyISAM,innoDB,MEMORY,ARCHIVE

InnoDB:支持事务处理,支持外键,支持崩溃修复能力和并发控制。如果需要对事务的完整性要求比较高(比如银行),要求实现并发控制(比如售票),那选择InnoDB有很大的优势。如果需要频繁的更新、删除操作的数据库,也可以选择InnoDB,因为支持事务的提交(commit)和回滚(rollback)。

MyISAM:插入数据快,空间和内存使用比较低。如果表主要是用于插入新记录和读出记录,那么选择MyISAM能实现处理高效率。如果应用的完整性、并发性要求比 较低,也可以使用。如果数据表主要用来插入和查询记录,则MyISAM引擎能提供较高的处理效率

MEMORY:所有的数据都在内存中,数据的处理速度快,但是安全性不高。如果需要很快的读写速度,对数据的安全性要求较低,可以选择MEMOEY。它对表的大小有要求,不能建立太大的表。所以,这类数据库只使用在相对较小的数据库表。如果只是临时存放数据,数据量不大,并且不需要较高的数据安全性,可以选择将数据保存在内存中的Memory引擎,MySQL中使用该引擎作为临时表,存放查询的中间结果

如果只有INSERT和SELECT操作,可以选择Archive,Archive支持高并发的插入操作,但是本身不是事务安全的。Archive非常适合存储归档数据,如记录日志信息可以使用Archiv

  1. mysql怎么写视图

create view视图名as select语句;

drop view视图名;

replace view 视图名 as select语句

  1. 数据库索引有哪些

普通索引:即针对数据库表创建索引

唯一索引:与普通索引类似,不同的就是:MySQL 数据库索引列的值

必须唯一,但允许有空值

主键索引:它是一种特殊的唯一索引,不允许有空值。一般是在建表的

时候同时创建主键索引

组合索引:为了进一步榨取 MySQL 的效率,就要考虑建立组合索引。

即将数据库表中的多个字段联合起来作为一个组合索引。

  1. 模糊查询%是放在前面查询效率快还是放在后面效率快

后面,如果放在前面会使索引失效

  1. 如果向数据库添加一条数据,怎么能快速查到你刚刚添加的这一条记录

order by id desc limit 1

  1. mysql存储过程

create procedure sp_name()
begin
.........
end

  1. 怎样测试一条sql语句的执行效率

Explain命令

  1. ddl与dml区别

数据操作语言 (DML) 和 数据定义语言 (DDL)

DML:

SELECT - 从数据库表中获取数据

UPDATE - 更新数据库表中的数据

DELETE - 从数据库表中删除数据

INSERT INTO - 向数据库表中插入数据

DDL:

CREATE DATABASE - 创建新数据库

ALTER DATABASE - 修改数据库

CREATE TABLE - 创建新表

ALTER TABLE - 变更(改变)数据库表

DROP TABLE - 删除表

CREATE INDEX - 创建索引(搜索键)

DROP INDEX - 删除索引

1.DML操作是需要手动控制事务的开启、提交(commit)和回滚的。

2.DDL操作是隐性提交的,不能rollback!

  1. 为什么mysql里面加了索引就会变快

很多人会说索引就相当于一本书的目录,通过目录来找书中的某一页,确实是很快的,如果没有目录,就需要一页一页的去翻书了,大大降低了效率。这个比喻其实还挺恰当的,也是一个很经典的索引比喻了。

在 InnoDB 中,每个索引其实都是一颗 B+ 树,主键索引称作聚簇索引,其他非主键索引称作二级索引,每个表中每一行的记录值都完整的保存在主键索引的叶子节点上,二级索引的叶子节点保存的是主键的值。

  1. Sql having 的作用

对group by 进行条件过滤

  1. 一个sql语句查询时间很长,你要怎么优化
    1. in 和 not in 要慎用,否则会导致全表扫描
    2. 查看sql是否涉及多表的联表或者子查询,如果有,看是否能进行业务拆分,相关字段冗余或者合并成临时表(业务和算法的优化)
    3. 涉及链表的查询,是否能进行分表查询,单表查询之后的结果进行字段整合
    4. 如果以上两种都不能操作,非要链表查询,那么考虑对相对应的查询条件做索引。加快查询速度
    5. 针对数量大的表进行历史表分离(如交易流水表)
    6. 数据库主从分离,读写分离,降低读写针对同一表同时的压力,至于主从同步,mysql有自带的binlog实现 主从同步
    7. explain分析sql语句,查看执行计划,分析索引是否用上,分析扫描行数等等
    8. 查看mysql执行日志,看看是否有其他方面的问题
    9. 对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引
  2. innodb对一行数据的读会锁吗?

不加锁,读实际读的是副本

  1. mysql目前用的版本

5.7 和8.0

  1. Delete、Drop、Truncate的区别?
  • delete是DML语句,可以选择删除部分数据,也可以选择删除全部数据;删除的数据可以回滚;不会释放空间
  • drop是DDL语句,删除表结构和所有数据,同时删除表结构所依赖的约束、触发器和索引;删除的数据无法回滚;会释放空间
  • truncate是DDL语句,删除表的所有数据,不能删除表的部分数据,也不能删除表的结构;删除的数据无法回滚;会释放空间
  • 执行速度:一般来说:drop>truncate>delete
  • 一般使用场景:如果一张表确定不再使用,我们使用drop来操作;如果只是删表中的全部数据,一般使用truncate;如果删除的是表中的部分数据,一般使用delete

  1. 事务四个特性

原子性、一致性、隔离性、持久性 简称ACID

  1. 事务的隔离级别

Read Uncommitted(读取未提交内容)

在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)。

Read Committed(读取提交内容)

这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。

这种隔离级别 也支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。

Repeatable Read(可重读)

这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)。

简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。

Serializable(可串行化)

这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。

  1. 如何创建一张表,显示公司所有的部门并找到上下级对应的关系?

在表中添加外键,引用自己表的主键, 创建树形结构

  1. 数据库表设计三大范式

第一范式(1NF): 字段具有原子性,不可再分。(所有关系型数据库系

统都满足第一范式数据库表中的字段都是单一属性的,不可再分)

第二范式(2NF) 要求数据库表中的每个实例或行必须可以被惟一地区分。通常需要为表加上一个列,以存储各个实例的惟一标识。这个惟一属性列被称为主关键字或主键。

第三范式(3NF) 要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。

  1. 什么是索引

数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更

新数据库表中数据。索引的实现通常使用 B 树及其变种 B+树

  1. [SELECT *] 和[SELECT 全部字段]的 2 种写法有何优缺点

1. 前者要解析数据字典,后者不需要

2. 结果输出顺序,前者与建表列顺序相同,后者按指定字段顺序。

3. 表字段改名,前者不需要修改,后者需要改

4. 后者可以建立索引进行优化,前者无法优化

5. 后者的可读性比前者要高

以上是关于MySQL面试题的主要内容,如果未能解决你的问题,请参考以下文章

搞懂开源框架设计思想真的这么重要吗?面试题分享

前端面试题-BFC(块格式化上下文)

2022年8月最新运维面试题-服务器上下架流程

2022年8月最新运维面试题-服务器上下架流程

sql面试题50题(mysql版)

前端面试题(执行上下文与执行上下文栈作用域与作用域链闭包内存溢出与内存泄露)