MySQL面试01

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重写+索引优化」三连击哦!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】【网络】UDP打洞-->不同子网下的客户端和服务器通信(未成功版)

【Linux】【网络】UDP打洞–>不同子网下的客户端和服务器通信&#xff08;未成功版&#xff09; 上次说基于UDP的打洞程序改了五版一直没有成功&#xff0c;要写一下问题所在&#xff0c;但是我后续又查询了一些资料&#xff0c;成功实现了&#xff0c;这次先写一下未成功的…

unity学习63,第2个小游戏:用fungus做一个简单对话游戏

目录 1 目标用fungus做一个简单的剧情对话游戏 1.1 先创建一个新的3D项目 1.2 fungus是什么 1.2.1 怎么获得 1.2 在AssetStore里搜索fungus (插件类)--千万别买收费的错的&#xff01; 1.3 fungus的官网 1.3.1 官网给的3个下载链接&#xff0c;unity的果然已经失效了 …

前后分离文件上传案例,前端HTML,后端Net6开发的webapi(完整源代码)下载

文件上传功能在项目开发中非常实用&#xff0c;本案例前端用HTML页面的form表单实现&#xff0c;后端用Net6实现。 前后分离文件上传案例&#xff0c;前端HTML&#xff0c;后端Net6&#xff08;完整源代码&#xff09; 下载链接https://download.csdn.net/download/luckyext/9…

利用Adobe Acrobat 实现PPT中图片分辨率的提升

1. 下载适用于 Windows 的 64 位 Acrobat 注册方式参考&#xff1a;https://ca.whu.edu.cn/knowledge.html?type1 2. 将ppt中需要提高分辨率的图片复制粘贴到新建的pptx问价中&#xff0c;然后执行“文件—>导出---->创建PDF、XPS文档” 3. 我们会发现保存下来的distrib…

自学微信小程序的第十二天

DAY12 1、腾讯地图SDK是一套为开发者提供多种地理位置服务的工具,可以使开发者在自己的应用中加入地图相关功能,轻松访问腾讯地图服务和数据,更好地实现微信小程序的地图功能。 表49:search()方法的常用选项 选项 类型 说明 keyword string POI搜索关键词,默认周边搜索 l…

海南自贸港的数字先锋:树莓集团的战略布局解析

海南自贸港凭借其独特的政策优势和地理条件&#xff0c;成为了数字产业发展的热土。树莓集团敏锐地捕捉到这一机遇&#xff0c;在此展开了全面而深远的战略布局。 在基础设施建设方面&#xff0c;树莓集团投入大量资金&#xff0c;建设了先进的数据中心。这些数据中心配备了顶…

MySQL -操作

博客主页&#xff1a;【夜泉_ly】 本文专栏&#xff1a;【暂无】 欢迎点赞&#x1f44d;收藏⭐关注❤️ 文章目录 创建数据库格式编码集 操控数据库查看数据库修改数据库删除数据库备份与还原 部分表操作创建表查看表修改表 我的版本号&#xff1a;8.0.41-0ubuntu0.22.04.1 创…

ubuntu20系统下conda虚拟环境下安装文件存储位置

在 Conda 虚拟环境中执行 pip install 安装软件后&#xff0c;安装的文件会存储在该虚拟环境专属的 site-packages 目录中。具体路径取决于你激活的 Conda 环境路径。以下是定位步骤&#xff1a; 1. 确认 Conda 虚拟环境的安装路径 查看所有环境&#xff1a; conda info --env…

Blazor-路由模板(上)

Blazor 的路由模板是定义应用中不同页面或组件访问路径的一种方式。通过路由模板&#xff0c;你可以管理应用程序的导航结构&#xff0c;支持基本路由、参数路由、子路由和区域路由等功能。 我们为访问组件使用page 指令指定路由 URL page "/demoPage" <h3>&l…

OpenObserve开源高性能云原生平台本地部署与远程监控数据攻略

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff1a;人工智能教程 文章目录 前言1. 安装Docker2. 创建并启动OpenObserve容器3. 本地访问测试4. 公网访问本地部署的OpenObserve4.1 内网穿透工具安装…

鸿蒙HarmonyOS-Navagation基本用法

Navagation基本用法 Navigation组件是路由导航的根视图容器&#xff0c;一般作为Page页面的根容器使用&#xff0c;其内部默认包含了标题栏&#xff0c;内容栏和公工具栏&#xff0c;其中内容区默认首页显示导航内容&#xff08;Navigation的子组件&#xff09;或非首页显示&am…

相控阵扫盲

下图展示天线增益 在仰角为0度的情况下随着方位角的变化而变化。需要注意到的是在天线视轴方向上的高增益主瓣上还有几个低增益旁瓣 阵列因子乘以新的阵元方向图会形成指向性更强的波速

CDefView::_OnFSNotify函数分析

进入CDefView::_OnFSNotify函数时状态栏 _UpdateStatusBar函数之后增加一个对象&#xff0c;变成7个对象。 LRESULT CDefView::_OnFSNotify(LONG lNotification, LPCITEMIDLIST* ppidl) { LPITEMIDLIST pidl; LPCITEMIDLIST pidlItem; // we may be registered for no…

人工智能之数学基础:矩阵的秩

本文重点 矩阵的秩,作为矩阵理论中的一个核心概念,是连接矩阵性质与应用的重要桥梁。本文我们将学习矩阵秩的概念,通过矩阵的秩可以判断矩阵是否可逆等等,所以矩阵的秩是非常重要的一个概念。 矩阵秩的概念 秩定义为矩阵A的线性独立的行(或列)的最大数目。也就是说,如…

告别GitHub连不上!一分钟快速访问方案

一、当GitHub抽风时&#xff0c;你是否也这样崩溃过&#xff1f; &#x1f621; npm install卡在node-sass半小时不动&#x1f62d; git clone到90%突然fatal: early EOF&#x1f92c; 改了半天hosts文件&#xff0c;第二天又失效了... 根本原因&#xff1a;传统代理需要复杂…

安装微软最新原版系统,配置好系统驱动并保留OOBE全新体验

记录一种安装原版系统&#xff0c;并在用户使用前安装好所有驱动&#xff0c;以及配置好网络和工作环境&#xff0c;但不影响用户全新体验的方法。 前言 有的时候我们可能会遇到这样一种情况&#xff1a; 需要给别人安装一个微软官网正版的全新系统&#xff0c;用户开机要有OO…

《导游职业资格考试:巧用答题技巧,实现分数飞跃》

《导游职业资格考试&#xff1a;巧用答题技巧&#xff0c;实现分数飞跃》 在导游职业资格考试中&#xff0c;掌握答题技巧能显著提升成绩。选择题方面&#xff0c;运用排除法是关键。对于考查导游基础知识的题目&#xff0c;如果选项中出现与历史事实不符、地理常识错误等明显…

嵌入式L6计算机网络

Telnet不加密 socket是应用层和下面的内核

C++、C#、python调用OpenCV进行图像处理耗时对比

C、C#、python调用OpenCV进行图像处理耗时对比 一、前言二、环境介绍三、耗时对比3.1读写jpg、bmp图片耗时对比3.2灰度化、阈值分割、膨胀腐蚀耗时对比 附录&#xff08;1&#xff09;imread函数以不同模式读取图片&#xff08;2&#xff09;OpenCV读取图片格式与PIL读取图片格…

【ubuntu20】--- 搭建 gerrit 最新最详细

在编程的艺术世界里&#xff0c;代码和灵感需要寻找到最佳的交融点&#xff0c;才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里&#xff0c;我们将共同追寻这种完美结合&#xff0c;为未来的世界留下属于我们的独特印记。 【ubuntu20】--- 搭建 gerrit 最新最详细…