面试问题浓缩总结 面试问题浓缩总结
  • Go
  • Java
  • C/C++
  • JavaScript/HTML
  • MySQL
  • Redis
  • MongoDB
  • 操作系统
  • 计算机网络
  • spring全家桶
  • mybatis
  • 中间件
  • 软件相关
  • 系统相关
  • 算法
  • 数据结构
  • 设计模式
  • CMU硕士经典100题
  • 剑指offer
  • 重点手撕代码
  • 程序员面试金典
  • 3月
  • 4月
  • 智力题
  • 业务问题
  • 一些技术
  • 安全相关
APP下载 (opens new window)
GitHub (opens new window)
  • Go
  • Java
  • C/C++
  • JavaScript/HTML
  • MySQL
  • Redis
  • MongoDB
  • 操作系统
  • 计算机网络
  • spring全家桶
  • mybatis
  • 中间件
  • 软件相关
  • 系统相关
  • 算法
  • 数据结构
  • 设计模式
  • CMU硕士经典100题
  • 剑指offer
  • 重点手撕代码
  • 程序员面试金典
  • 3月
  • 4月
  • 智力题
  • 业务问题
  • 一些技术
  • 安全相关
APP下载 (opens new window)
GitHub (opens new window)
  • MySQL

    • 数据库基础
    • 引擎
    • 索引
    • 事务和锁
    • 视图,存储过程,函数,触发器
    • SQL语句及优化
    • 分布式和备份
    • 高频面试题
      • 不知道从哪里抄的
        • 如何查看表格定义的所有索引
        • LIKE 声明中的%和 _ 是什么意思?
        • 如何在 Unix 和 MySQL 时间戳之间进行转换?
        • 列对比运算符是什么?
        • BLOB 和 TEXT 有什么区别?
        • 非标准字符串类型?
        • 通用 SQL 函数?
        • 锁的优化策略
        • 完整性约束
      • 牛客上总结的
        • SQL语句执行慢的原因
        • 100万条数据索引树会有多高
        • InnoDB 一棵 B+ 树可以存放多少行数据
        • where和having的区别
        • MySQL关键词执行的顺序
        • MySQL表设计的注意事项
    • MySQL底层
  • Redis

  • MongoDB

  • 数据库
  • MySQL
小游
2021-03-22

高频面试题

# 不知道从哪里抄的

# 如何查看表格定义的所有索引

SHOW INDEX FROM <tablename>;

# LIKE 声明中的%和 _ 是什么意思?

%对应于 0 个或更多字符,_只是 LIKE 语句中的一个字符。

# 如何在 Unix 和 MySQL 时间戳之间进行转换?

UNIX_TIMESTAMP 是从 MySQL 时间戳转换为 Unix 时间戳的命令

FROM_UNIXTIME 是从 Unix 时间戳转换为 MySQL 时间戳的命令

# 列对比运算符是什么?

在 SELECT 语句的列比较中使用=,<>,<=,<,> =,>,<<,>>,<=>,AND, OR 或 LIKE 运算符。

  • <>、!= 不等于

  • << 位运算(左移)

  • <=> 安全比较运算符,用来做 NULL 值的关系运算。

  • := 和= 差不多,= 只有在 set 和update时才是和 := 一样,赋值的作用,其它都是关系运算符 等于 的作用,:= 不只在 set 和 update 时赋值的作用,在 select 也是赋值的作用。

  • @ 用户变量

    SET @name = "big_cat";
    SELECT 'big_cat' INTO @name;
    SELECT @name := 'big_cat';
    
    1
    2
    3
  • @@ 系统变量

    SELECT @@global.sort_buffer_size;
    SHOW GLOBAL VARIABLES LIKE 'sort_buffer_size';
    SET @@global.sort_buffer_size = 2 * 1024 * 1024;
    SET SESSION sort_buffer_size = 2 * 1024 * 1024;
    
    1
    2
    3
    4

更多运算符参考:

MySQL 运算符 | 菜鸟教程 (runoob.com) (opens new window)

mysql 运算符 <=>,:=,@,@@的含义 - big_cat - OSCHINA - 中文开源技术交流社区 (opens new window)

# BLOB 和 TEXT 有什么区别?

BLOB 是一个二进制对象,可以容纳可变数量的数据。TEXT 是一个不区分大小写 的 BLOB。 BLOB 和 TEXT 类型之间的唯一区别在于对 BLOB 值进行排序和比较时区分大小 写,对 TEXT 值不区分大小写。

# 非标准字符串类型?

1、TINYTEXT 2、TEXT 3、MEDIUMTEXT 4、LONGTEXT

# 通用 SQL 函数?

  1. CONCAT(A, B) – 连接两个字符串值以创建单个字符串输出。通常用于将两个 或多个字段合并为一个字段。
  2. FORMAT(X, D)- 格式化数字 X 到 D 有效数字。
  3. CURRDATE(), CURRTIME()- 返回当前日期或时间。
  4. NOW() – 将当前日期和时间作为一个值返回。
  5. MONTH(),DAY(),YEAR(),WEEK(),WEEKDAY() – 从日期 值中提取给定数据。
  6. HOUR(),MINUTE(),SECOND() – 从时间值中提取给定数据。
  7. DATEDIFF(A,B) – 确定两个日期之间的差异,通常用于计算年龄
  8. SUBTIMES(A,B) – 确定两次之间的差异。
  9. FROMDAYS(INT) – 将整数天数转换为日期值。

# 锁的优化策略

1、读写分离 2、分段加锁 3、减少锁持有的时间 4.多个线程尽量以相同的顺序去获取资源

不能将锁的粒度过于细化,不然可能会出现线程的加锁和释放次数过多,反而效 率不如一次加一把大锁。

# 完整性约束

数据完整性(Data Integrity)是指数据的精确(Accuracy)和可靠性(Reliability)。

分为以下四类:

  1. 实体完整性:规定表的每一行在表中是惟一的实体。
  2. 域完整性:是指表中的列必须满足某种特定的数据类型约束,其中约束又包括 取值范围、精度等规定。
  3. 参照完整性:是指两个表的主关键字和外关键字的数据应一致,保证了表之间 的数据的一致性,防止了数据丢失或无意义的数据在数据库中扩散。
  4. 用户定义的完整性:不同的关系数据库系统根据其应用环境的不同,往往还需 要一些特殊的约束条件。用户定义的完整性即是针对某个特定关系数据库的约束 条件,它反映某一具体应用必须满足的语义要求。

与表有关的约束:包括列约束(NOT NULL(非空约束))和表约束(PRIMARY KEY、 foreign key、check、UNIQUE) 。

# 牛客上总结的

# SQL语句执行慢的原因

1、SQL偶尔执行慢,可能是因为网络抖动、InnoDB的脏页刷新机制、操作等待锁资源导致的;

2、SQL一直执行慢,可能是因为SQL执行没有索引或者没有走上索引,以及单表数据量过大导致的。

后续继续补充。。。

参考:

  • 腾讯面试:一条SQL语句执行得很慢的原因有哪些?---不看后悔系列 - 帅地 - 博客园 (cnblogs.com) (opens new window)
  • SQL执行慢的原因分析_wtopps的专栏-CSDN博客_慢sql的原因 (opens new window)

# 100万条数据索引树会有多高

可见90万条记录以下,树的高度为2。100万条为 3 层。

分析可以看这篇文章 如何获取 MySQL innodb 的 B+tree 的高度 - 博学无忧 (bo56.com) (opens new window)

# InnoDB 一棵 B+ 树可以存放多少行数据

一般是2-3层,不会太高,所以大概可以存储2千万的数据。

非叶子节点能存放多少指针?

其实这也很好算,我们假设主键 ID 为 bigint 类型,长度为 8 字节,而指针大小在 InnoDB 源码中设置为 6 字节,这样一共 14 字节,我们一个页中能存放多少这样的单元,其实就代表有多少指针,即 16384/14=1170。

那么可以算出一棵高度为 2 的 B+ 树,能存放 1170*16=18720 条这样的数据记录。

根据同样的原理我们可以算出一个高度为 3 的 B+ 树可以存放: 1170117016=21902400 条这样的记录。

所以在 InnoDB 中 B+ 树高度一般为 1-3 层,它就能满足千万级的数据存储。

在查找数据时一次页的查找代表一次 IO,所以通过主键索引查询通常只需要 1-3 次 IO 操作即可查找到数据。

# where和having的区别

“Where” 是一个约束声明,使用Where来约束来之数据库 (opens new window)的数据,Where是在结果返回之前起作用的,且Where中不能使用聚合函数。

“Having”是一个过滤声明,是在查询返回结果集以后对查询结果进行的过滤操作,在Having中可以使用聚合函数。

SQL中where和having的区别_Lavi的专栏-CSDN博客_having where 区别 (opens new window)

# MySQL关键词执行的顺序

from
on
join
where
group by
having
select
distinct
union
order by
1
2
3
4
5
6
7
8
9
10

语法顺序如下

select[distinct]  
from  
join(如left join)  
on  
where  
group by  
having  
union  
order by  
limit
1
2
3
4
5
6
7
8
9
10

SQL关键字的执行顺序 - DiYong - 博客园 (cnblogs.com) (opens new window)

# MySQL表设计的注意事项

MySQL 数据表设计规范 - 知乎 (zhihu.com) (opens new window)

编辑 (opens new window)
上次更新: 2021/04/24, 10:38:20
分布式和备份
MySQL底层

← 分布式和备份 MySQL底层→

Theme by Vdoing | Copyright © 2021-2021 小游
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式