高频面试题
# 不知道从哪里抄的
# 如何查看表格定义的所有索引
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 函数?
- CONCAT(A, B) – 连接两个字符串值以创建单个字符串输出。通常用于将两个 或多个字段合并为一个字段。
- FORMAT(X, D)- 格式化数字 X 到 D 有效数字。
- CURRDATE(), CURRTIME()- 返回当前日期或时间。
- NOW() – 将当前日期和时间作为一个值返回。
- MONTH(),DAY(),YEAR(),WEEK(),WEEKDAY() – 从日期 值中提取给定数据。
- HOUR(),MINUTE(),SECOND() – 从时间值中提取给定数据。
- DATEDIFF(A,B) – 确定两个日期之间的差异,通常用于计算年龄
- SUBTIMES(A,B) – 确定两次之间的差异。
- FROMDAYS(INT) – 将整数天数转换为日期值。
# 锁的优化策略
1、读写分离 2、分段加锁 3、减少锁持有的时间 4.多个线程尽量以相同的顺序去获取资源
不能将锁的粒度过于细化,不然可能会出现线程的加锁和释放次数过多,反而效 率不如一次加一把大锁。
# 完整性约束
数据完整性(Data Integrity)是指数据的精确(Accuracy)和可靠性(Reliability)。
分为以下四类:
- 实体完整性:规定表的每一行在表中是惟一的实体。
- 域完整性:是指表中的列必须满足某种特定的数据类型约束,其中约束又包括 取值范围、精度等规定。
- 参照完整性:是指两个表的主关键字和外关键字的数据应一致,保证了表之间 的数据的一致性,防止了数据丢失或无意义的数据在数据库中扩散。
- 用户定义的完整性:不同的关系数据库系统根据其应用环境的不同,往往还需 要一些特殊的约束条件。用户定义的完整性即是针对某个特定关系数据库的约束 条件,它反映某一具体应用必须满足的语义要求。
与表有关的约束:包括列约束(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
2
3
4
5
6
7
8
9
10
语法顺序如下
select[distinct]
from
join(如left join)
on
where
group by
having
union
order by
limit
2
3
4
5
6
7
8
9
10
SQL关键字的执行顺序 - DiYong - 博客园 (cnblogs.com) (opens new window)