MySQL偏门但基础的面试题集锦

文章目录

    • [1. TIMESTAMP和DATETIME的微妙区别?](#1. TIMESTAMP和DATETIME的微妙区别?)
    • [2. VARCHAR(255)和VARCHAR(256)的存储差异?](#2. VARCHAR(255)和VARCHAR(256)的存储差异?)
    • [3. COUNT(*)、COUNT(1)、COUNT(字段)的区别?](#3. COUNT(*)、COUNT(1)、COUNT(字段)的区别?)
    • [4. LIMIT 1000000, 10为什么这么慢?](#4. LIMIT 1000000, 10为什么这么慢?)
    • [5. 为什么InnoDB表必须有主键?](#5. 为什么InnoDB表必须有主键?)
    • [6. MySQL的隐式类型转换规则?](#6. MySQL的隐式类型转换规则?)
    • [7. DELETE FROM table和TRUNCATE的隐藏区别?](#7. DELETE FROM table和TRUNCATE的隐藏区别?)

1. TIMESTAMP和DATETIME的微妙区别?

  • TIMESTAMP存储UTC时间,会根据当前时区转换显示
  • DATETIME存储的是字面值,不受时区影响
  • TIMESTAMP范围:1970-2038年,DATETIME范围:1000-9999年
  • TIMESTAMP在UPDATE时可以自动更新为当前时间

2. VARCHAR(255)和VARCHAR(256)的存储差异?

sql 复制代码
-- VARCHAR(255):长度用1字节存储
-- VARCHAR(256):长度用2字节存储
CREATE TABLE test_varchar (
    col1 VARCHAR(255),  -- 最大占用255+1=256字节
    col2 VARCHAR(256)   -- 最大占用256+2=258字节
);
  • VARCHAR长度≤255时,用1字节存储长度信息
  • VARCHAR长度>255时,用2字节存储长度信息

3. COUNT(*)、COUNT(1)、COUNT(字段)的区别?

sql 复制代码
CREATE TABLE test_count (
    id INT,
    name VARCHAR(50)
);

INSERT INTO test_count VALUES 
(1, 'Alice'), (2, NULL), (3, 'Bob');

SELECT COUNT(*);     -- 结果:3
SELECT COUNT(1);     -- 结果:3
SELECT COUNT(id);    -- 结果:3
SELECT COUNT(name);  -- 结果:2(NULL不计入)
  • COUNT(*)和COUNT(1)性能相同,都统计行数
  • COUNT(字段)会忽略NULL值
  • InnoDB中COUNT(*)有优化,会选择最小的索引来计数

4. LIMIT 1000000, 10为什么这么慢?

sql 复制代码
-- 这个查询需要先排序前1000010条记录,再取最后10条
SELECT * FROM users ORDER BY id LIMIT 1000000, 10;

-- 优化方法:使用子查询 + 主键
SELECT * FROM users 
WHERE id >= (SELECT id FROM users ORDER BY id LIMIT 1000000, 1)
ORDER BY id LIMIT 10;

-- 或者使用游标分页
SELECT * FROM users WHERE id > 1000000 ORDER BY id LIMIT 10;

5. 为什么InnoDB表必须有主键?

sql 复制代码
-- 创建没有主键的表
CREATE TABLE test_no_pk (
    name VARCHAR(50),
    age INT
) ENGINE=InnoDB;

-- MySQL会按以下顺序创建隐藏主键:
-- 1. 选择第一个非NULL的UNIQUE索引作为主键
-- 2. 如果没有,创建一个6字节的隐藏rowid字段作为主键

6. MySQL的隐式类型转换规则?

偏门点: 字符串和数字比较的转换规则

sql 复制代码
SELECT '123' = 123;        -- 结果:1(true)
SELECT '123abc' = 123;     -- 结果:1(true)!!!
SELECT 'abc123' = 123;     -- 结果:0(false)

-- 字符串转数字:从左开始,遇到非数字字符停止
SELECT '123.45abc' + 0;    -- 结果:123.45
SELECT 'abc123' + 0;       -- 结果:0
  • 字符串与数字比较时,字符串会转换为数字
  • 转换规则:从左开始取数字部分,遇到非数字停止

7. DELETE FROM table和TRUNCATE的隐藏区别?

sql 复制代码
-- DELETE会触发触发器,TRUNCATE不会
CREATE TRIGGER tr_delete BEFORE DELETE ON test_table
FOR EACH ROW INSERT INTO log_table VALUES(OLD.id);

DELETE FROM test_table;   
TRUNCATE test_table;       

-- AUTO_INCREMENT重置行为不同,都会清空表数据
-- DELETE后AUTO_INCREMENT值保持不变
-- TRUNCATE后AUTO_INCREMENT重置为1
相关推荐
爱喝水的鱼丶2 小时前
SAP-ABAP:S/4 HANA ABAP 新特性入门:与 ECC ABAP 的核心差异、架构优势与学习路径规划
运维·数据库·性能优化·sap·abap·hana·开发交流
余槐i9 小时前
PostgreSQL 函数索引报错 must be immutable:3种绕法与代价
数据库·后端·sql·postgresql·性能优化
数据库小学妹9 小时前
PostgreSQL表膨胀怎么办?autovacuum清不动的根因与排查命令
数据库·postgresql·表膨胀·mvcc·数据库运维
mister_guo9 小时前
MySQL-1267错误:排序规则冲突的原因与解决方案
数据库·mysql
骇客野人10 小时前
在麒麟操作系统上 分别安装 jdk1.8, 达梦数据库,redis ,memcache 的操作实施方案和步骤
数据库·redis·memcached
美狐美颜SDK开放平台11 小时前
直播APP如何实现美白滤镜功能?视频美颜SDK技术开发方案详解
前端·数据库·人工智能·音视频·美颜sdk·直播美颜sdk·视频美颜sdk
Lost_the_wind11 小时前
MySQL学习笔记五
mysql
花间相见13 小时前
【计算基础|MySQL01】【上手】安装连接、数据类型与建库建表
数据库·后端
花间相见13 小时前
【计算基础|MySQL02】【上手】SQL 增删改查
数据库·后端
ITxiaobing202313 小时前
IP 库与 AppsFlyer 国家/地区数据不一致,如何系统地对账?
数据库·网络协议·tcp/ip