MySQL面试01

news2025/3/4 9:23:51

MySQL 索引的最左原则

🍰 最左原则本质
=͟͟͞͞( •̀д•́) 想象复合索引是电话号码簿!
索引 (a,b,c) 的排列顺序:
先按a排序 → a相同按b排序 → 最后按c排序

生效场景三连:
1️⃣ WHERE a=1 ✅
2️⃣ WHERE a=1 AND b=2 ✅
3️⃣ WHERE a=1 AND b=2 AND c=3 ✅

💣 失效场景三连:
1️⃣ WHERE b=2 ❌ (跳过了a)
2️⃣ WHERE a=1 AND c=3 ❌ (中间断了b)
3️⃣ WHERE b=2 AND c=3 ❌ (首列失踪)

✨ 特殊技巧:

  • WHERE a>1 AND b=2 → 只有a能用索引(范围查询后断链)
  • WHERE a=1 ORDER BY b,c → 排序也能用索引!
  • WHERE a LIKE '张%' ✅ (前缀匹配)

哦呜(°ロ°)!曼波举个栗子:
索引是(班级, 姓名, 年龄)
✅ 查"3班 张三" → 直接翻到3班区域找张三
❌ 直接查"年龄18" → 要扫描全校学生

InnoDB 和 Mylsam 引擎的区别?

这两个引擎的区别就像奶茶和咖啡的选择,要根据场景来pick哦!

🍵 MyISAM(经典奶茶型)
=͟͟͞͞( •̀д•́) 适合读多写少的场景!

  • 不支持事务(像现金交易,要么成功要么失败)
  • 表级锁(修改时要锁整个表)
  • 存储结构:
    .MYD数据文件 + .MYI索引文件(像分开的奶茶和珍珠)
  • 特色技能:
    ✅ 全文索引
    ✅ COUNT(*) 超快(自带计数器)
    ❌ 崩溃后容易数据损坏

☕ InnoDB(现代咖啡机型)
(๑•̀ㅂ•́)و✧ 适合高并发事务场景!

  • 支持ACID事务(像电子支付可回滚)
  • 行级锁(只锁修改的行)
  • 存储结构:
    聚簇索引(数据&索引存在一起像浓缩咖啡)
  • 特色技能:
    ✅ 外键约束
    ✅ 崩溃自动恢复(redo log像咖啡机自动清洁)
    ✅ MVCC多版本并发控制

📊 性能对比小剧场:

  • 全表COUNT:MyISAM 🚀(秒出结果) vs InnoDB 🐢(要扫描)
  • 并发写入:MyISAM 😵(表锁阻塞) vs InnoDB 😎(行锁流畅)
  • 数据安全:MyISAM 🚑(需定期修复) vs InnoDB 🛡️(自动恢复)

(✪▽✪)曼波~~ 现在主流都用InnoDB啦~就像大家现在更爱喝手冲咖啡!除非特殊需求(比如全文检索),否则推荐默认选InnoDB哦!

有哪些优化数据库性能的方法?

一、💡 SQL 优化三板斧

1. EXPLAIN 大法

EXPLAIN SELECT * FROM users WHERE age > 25 ORDER BY create_time;
-- 重点观察:type(扫描类型)、key(使用索引)、rows(扫描行数)

2. 索引优化技巧

  • 给WHERE/ORDER BY/JOIN字段加索引
  • 避免在索引列上做计算:WHERE YEAR(create_time)=2023 ❌
  • 使用覆盖索引:SELECT 索引字段

3. 慢查询日志分析

# my.cnf 配置
slow_query_log = 1
long_query_time = 1  # 超过1秒的查询

mysqldumpslow工具分析日志


二、🚀 结构设计优化

1. 三范式与反范式的平衡

  • 适度冗余:减少JOIN次数
  • 大字段分离:把TEXT/BLOB单独存表

2. 分区表实战

-- 按时间范围分区
CREATE TABLE logs (
    id INT,
    log_time DATETIME
) PARTITION BY RANGE (YEAR(log_time)) (
    PARTITION p2022 VALUES LESS THAN (2023),
    PARTITION p2023 VALUES LESS THAN (2024)
);

3. 冷热数据分离

  • 热数据:最近3个月订单 → SSD存储
  • 冷数据:历史订单 → HDD归档

三、⚙️ 配置调优示例

InnoDB 核心参数

innodb_buffer_pool_size = 70%内存  # 缓存池大小
innodb_flush_log_at_trx_commit = 2  # 平衡安全与性能
max_connections = 1000  # 根据实际调整

四、🛠️ 架构级优化

1. 读写分离

  • 主库处理写操作
  • 从库处理读查询

2. 缓存策略

import redis.clients.jedis.Jedis;

public class UserService {
    private static final String REDIS_HOST = "localhost";
    private static final int REDIS_PORT = 6379;
    
    // 曼波小贴士:真实项目要用连接池哦!
    public User getUser(String userId) {
        try (Jedis jedis = new Jedis(REDIS_HOST, REDIS_PORT)) {
            // 1. 先查缓存
            String redisKey = "user:" + userId;
            String cachedData = jedis.get(redisKey);
            
            if (cachedData != null) {
                return JSON.parseObject(cachedData, User.class); // 使用JSON库反序列化
            }
            
            // 2. 缓存未命中则查数据库
            User user = jdbcTemplate.queryForObject(
                "SELECT * FROM users WHERE id = ?", 
                new Object[]{userId}, 
                new UserRowMapper()
            );
            
            // 3. 写入缓存(设置1小时过期)
            if (user != null) {
                jedis.setex(redisKey, 3600, JSON.toJSONString(user));
            }
            return user;
        }
    }
}

3. 分库分表

  • 垂直分库:用户库、订单库分离
  • 水平分表:user_001, user_002...


(✪▽✪)曼波~~ 记住优化要像中医把脉,先诊断(分析慢查询)再开方(针对性优化)!

如何定位慢查询?

一、🔍 基础定位三板斧

1. 慢查询日志捕获

-- 临时开启(重启失效)
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;  -- 超过1秒的查询
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';

-- 永久生效配置(my.cnf)
[mysqld]
slow_query_log = 1
long_query_time = 1
log_queries_not_using_indexes = 1  -- 记录未走索引的查询

2. 日志分析神器

# 查看最耗时的10个慢查询
mysqldumpslow -s t -t 10 /var/log/mysql/slow.log

# 解析结果示例
Count: 5  Time=3.21s (16s)  Lock=0.00s (0s)  Rows=1000.0 (5000)
  SELECT * FROM orders WHERE user_id=N

 

3. 实时监控SHOW PROCESSLIST

-- 查看正在运行的查询
SHOW FULL PROCESSLIST;

-- 重点关注:
State: "Sending data"      -- 正在传输数据
Time: 大于100秒的查询       -- 可能卡住的查询

二、🔧 深度分析工具包

1. EXPLAIN 执行计划解读

EXPLAIN FORMAT=JSON 
SELECT * FROM products 
WHERE category='electronics' 
ORDER BY price DESC;

-- 关键指标:
"access_type": "ALL"        -- 全表扫描(危险!)
"rows_examined_per_scan": 10000  -- 扫描行数
"using_filesort": true      -- 文件排序(需优化)
 

2. Performance Schema 监控

-- 开启性能监控
UPDATE performance_schema.setup_instruments 
SET ENABLED = 'YES' 
WHERE NAME LIKE '%statement/%';

-- 查询TOP SQL
SELECT DIGEST_TEXT, AVG_TIMER_WAIT 
FROM performance_schema.events_statements_summary_by_digest 
ORDER BY AVG_TIMER_WAIT DESC 
LIMIT 10;
 

3. pt-query-digest 高级分析

# 使用Percona Toolkit
pt-query-digest /var/log/mysql/slow.log

-- 输出包括:
# Rank 响应时间占比
# Attribute 各SQL指纹
# Exec time 执行时间统计
 

三、🚀 Java生态专用方案

1. Druid 连接池监控

// Spring Boot配置
@Bean
public ServletRegistrationBean<StatViewServlet> druidServlet() {
    return new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*");
}

// 监控指标包括:
- SQL执行时间排行
- 慢SQL记录(支持配置阈值)
- 执行次数TOP SQL
 

2. MyBatis 打印慢SQL

<!-- mybatis-config.xml -->
<settings>
    <setting name="defaultStatementTimeout" value="5"/> <!-- 超时5秒 -->
</settings>

<!-- 配合p6spy记录真实SQL -->
driverClassName=com.p6spy.engine.spy.P6SpyDriver


 

(✪▽✪)曼波~~ 定位到慢SQL后,记得用「EXPLAIN+SQL重写+索引优化」三连击哦!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2309423.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

webpack一篇

目录 一、构建工具 1.1简介 二、Webpack 2.1概念 2.2使用步骤 2.3配置文件&#xff08;webpack.config.js&#xff09; mode entry output loader plugin devtool 2.4开发服务器&#xff08;webpack-dev-server&#xff09; grunt/glup的对比 三、Vite 3.1概念 …

健康饮食,健康早餐

营养早餐最好包含4大类食物&#xff1a;谷薯类&#xff1b;碳水&#xff1b;蛋白质&#xff1b;膳食纤维。 1.优质碳水 作用&#xff1a;提供持久的能量&#xff0c;避免血糖大幅波动等 例如&#xff1a;全麦面包、红薯&#x1f360;、玉米&#x1f33d;、土豆&#x1f954;、…

【经验分享】Ubuntu20.04 vmware虚拟机存储空间越来越小问题(已解决)

【经验分享】Ubuntu20.04 vmware虚拟机存储空间越来越小问题&#xff08;已解决&#xff09; 前言一、问题分析二、解决方案 前言 我们在使用虚拟机过程中&#xff0c;经常会碰到即使删除了一些文件&#xff0c;但是存储空间还是越来越小的问题。今天我们来解决下这个问题。 一…

Jenkins-自动化部署-通知

场景 使用jenkins部署&#xff0c;但有时不能立马部署&#xff0c;需要先通知相关人员&#xff0c;再部署&#xff0c;如果确实不能部署&#xff0c;可以留时间撤销。 方案 1.开始前我们添加&#xff0c;真正开始执行的等待时间&#xff1b;可供选择&#xff08;Choice Param…

Qt 文件操作+多线程+网络

文章目录 1. 文件操作1.1 API1.2 例子1&#xff0c;简单记事本1.3 例子2&#xff0c;输出文件的属性 2. Qt 多线程2.1 常用API2.2 例子1&#xff0c;自定义定时器 3. 线程安全3.1 互斥锁3.2 条件变量 4. 网络编程4.1 UDP Socket4.2 UDP Server4.3 UDP Client4.4 TCP Socket4.5 …

《基于Hadoop的青岛市旅游景点游客行为分析系统设计与实现》开题报告

目录 一、选题依据 1.选题背景 2.国内外研究现状 &#xff08;1&#xff09;国内研究现状 &#xff08;2&#xff09;国外研究现状 3.发展趋势 4.应用价值 二、研究内容 1.学术构想与思路 2. 拟解决的关键问题 3. 拟采取的研究方法 4. 技术路线 (1)旅游前准备阶段 …

pycharm debug卡住

pycharm debug时一直出现 collecting data, 然后点击下一行就卡住。 勾选 Gevent compatible解决 https://stackoverflow.com/questions/39371676/debugger-times-out-at-collecting-data

ISP 常见流程

1.sensor输出&#xff1a;一般为raw-OBpedestal。加pedestal避免减OB出现负值&#xff0c;同时保证信号超过ADC最小电压阈值&#xff0c;使信号落在ADC正常工作范围。 2. pedestal correction&#xff1a;移除sensor加的基底&#xff0c;确保后续处理信号起点正确。 3. Linea…

java数据结构_Map和Set(一文理解哈希表)_9.3

目录 5. 哈希表 5.1 概念 5.2 冲突-概念 5.3 冲突-避免 5.4 冲突-避免-哈希函数的设计 5.5 冲突-避免-负载因子调节 5.6 冲突-解决 5.7 冲突-解决-闭散列 5.8 冲突-解决-开散列 / 哈希桶 5.9 冲突严重时的解决办法 5. 哈希表 5.1 概念 顺序结构以及平衡树中&#x…

基于SpringBoot的“数据驱动的资产管理系统站”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“数据驱动的资产管理系统站”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构图 局部E-R图 系统登录界…

excel 斜向拆分单元格

右键-合并单元格 右键-设置单元格格式-边框 在设置好分割线后&#xff0c;你可以开始输入文字。 需要注意的是&#xff0c;文字并不会自动分成上下两行。 为了达到你期望的效果&#xff0c;你可以通过 同过左对齐、上对齐 空格键或使用【AltEnter】组合键来调整单元格中内容的…

深入理解推理语言模型(RLM)

大语言模型从通用走向推理&#xff0c;万字长文解析推理语言模型&#xff0c;建议收藏后食用。 本文基于苏黎世联邦理工学院的论文《Reasoning Language Models: A Blueprint》进行整理&#xff0c;你将会了解到&#xff1a; 1、RLM的演进与基础&#xff1a;RLM融合LLM的知识广…

2025年具有百度特色的软件测试面试题

百度业务场景 如何测试一个高并发的搜索系统(如百度搜索)?如何测试一个在线地图服务(如百度地图)?如何测试一个大型推荐系统(如百度推荐)的性能?百度技术栈 你对百度的 PaddlePaddle 框架有了解吗?如何测试基于 PaddlePaddle 的服务?如何测试百度云的 API 服务?你对…

Lua | 每日一练 (5)

&#x1f4a2;欢迎来到张胤尘的技术站 &#x1f4a5;技术如江河&#xff0c;汇聚众志成。代码似星辰&#xff0c;照亮行征程。开源精神长&#xff0c;传承永不忘。携手共前行&#xff0c;未来更辉煌&#x1f4a5; 文章目录 Lua | 每日一练 (5)题目参考答案浅拷贝深拷贝使用场景…

C# Unity 唐老狮 No.5 模拟面试题

本文章不作任何商业用途 仅作学习与交流 安利唐老狮与其他老师合作的网站,内有大量免费资源和优质付费资源,我入门就是看唐老师的课程 打好坚实的基础非常非常重要: 全部 - 游习堂 - 唐老狮创立的游戏开发在线学习平台 - Powered By EduSoho 如果你发现了文章内特殊的字体格式,…

云原生事件驱动架构:构建实时响应的数字化神经系统

引言&#xff1a;重塑企业实时决策能力 Uber实现事件驱动架构升级后&#xff0c;实时供需匹配延迟降至8ms&#xff0c;动态定价策略响应速度提升1200倍。Netflix通过事件流处理实现个性化推荐&#xff0c;用户点击率提高34%&#xff0c;事件处理吞吐量达2000万/秒。Confluent基…

Metasploit multi/handler 模块高级选项解析

multi/handler 是 Metasploit 框架中至关重要的模块&#xff0c;主要用于监听目标机的连接并处理来自目标的反向 shell 或会话。它可以灵活地适应不同渗透测试场景&#xff0c;提供高度的自定义选项以优化监听器的行为。 在 Metasploit msf6 框架中&#xff0c;当使用 exploit…

WPF高级 | WPF 应用程序部署与发布:确保顺利交付到用户手中

WPF高级 | WPF 应用程序部署与发布&#xff1a;确保顺利交付到用户手中 一、前言二、部署与发布基础概念2.1 部署的定义与目的2.2 发布的方式与渠道2.3 部署与发布的关键要素 三、WPF 应用程序打包3.1 使用 Visual Studio 自带的打包工具3.2 使用第三方打包工具 四、发布到不同…

Spring MVC 程序开发(1)

目录 1、什么是 SpringMVC2、返回数据2.1、返回 JSON 对象2.2、请求转发2.3、请求重定向2.4、自定义返回的内容 1、什么是 SpringMVC 1、Tomcat 和 Servlet 分别是什么&#xff1f;有什么关系&#xff1f; Servlet 是 java 官方定义的 web 开发的标准规范&#xff1b;Tomcat 是…

C# Unity 唐老狮 No.4 模拟面试题

本文章不作任何商业用途 仅作学习与交流 安利唐老狮与其他老师合作的网站,内有大量免费资源和优质付费资源,我入门就是看唐老师的课程 打好坚实的基础非常非常重要: 全部 - 游习堂 - 唐老狮创立的游戏开发在线学习平台 - Powered By EduSoho 如果你发现了文章内特殊的字体格式,…