MySQL面试题

10 篇文章 0 订阅
2 篇文章 0 订阅

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. 后者的可读性比前者要高

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小坏蛋至尊宝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值