当前位置: 首页 > news >正文

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

文章目录

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

1. TIMESTAMP和DATETIME的微妙区别?

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

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

-- 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(字段)的区别?

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为什么这么慢?

-- 这个查询需要先排序前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表必须有主键?

-- 创建没有主键的表
CREATE TABLE test_no_pk (name VARCHAR(50),age INT
) ENGINE=InnoDB;-- MySQL会按以下顺序创建隐藏主键:
-- 1. 选择第一个非NULL的UNIQUE索引作为主键
-- 2. 如果没有,创建一个6字节的隐藏rowid字段作为主键

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

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

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的隐藏区别?

-- 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
http://www.lryc.cn/news/610366.html

相关文章:

  • webm 读取解析
  • 并发编程常用工具类(上):CountDownLatch 与 Semaphore 的协作应用
  • Linux 使用 firewalld :开放端口与常用操作指南
  • 【机器学习】(算法优化二)提升算法之:AdaBoost与随机梯度
  • C++多线程同步:深入理解互斥量与事件机制
  • 【node】token的生成与解析配置
  • 笔试——Day28
  • 我用一个 Postgres 实现一整套后端架构!
  • LeetCode 分类刷题:16. 最接近的三数之和
  • 【Unity】协程 Async
  • 体育数据创业:用 API + 比分网,低成本快速验证
  • Mirror学习笔记
  • Linux RAID 存储技术
  • GaussDB 数据库架构师(十二) 资源规划
  • 用户与组管理命令
  • 小实验:按键点灯(中断法)
  • 【笔记】ROS1|5 ARP攻击Turtlebot3汉堡Burger并解析移动报文【旧文转载】
  • traefik网关鉴权中间件转发multipart/form-data请求的multipart: NextPart: EOF问题
  • LLM大模型时代:生活服务领域的“生存革命“与新生态重构
  • 深度学习-卷积神经网络CNN-卷积层
  • 探索机器学习在医疗领域的应用与挑战
  • Flask 项目 Windows 服务器部署全流程
  • C++信息学奥赛一本通-第一部分-基础一-第一章
  • RTX5060显卡安装cuda版本PyTorch踩坑记录
  • 深度解析:CPU 与 GPU 上的张量运算,为何“快”与“慢”并非绝对?
  • chatgpt plus简单得,不需要求人,不需要野卡,不需要合租,不需要昂贵的价格
  • 从 0 到 1 开发图书管理系统:飞算 JavaAI 让技术落地更简单
  • Oracle MCP Server简单配置以及备份调用
  • Oracle EBS ERP接口开发 — 修复bug基本流程
  • Calcite自定义扩展SQL案例详细流程篇