MySQL篇

简介: 本文详解MySQL核心知识点:查询语句的书写与执行顺序、多表连接方式(内连接、外连接)、CHAR与VARCHAR区别、索引类型及底层B+树结构,重点解析聚簇/非聚簇索引、回表查询、覆盖索引、左前缀原则、索引失效场景及优化策略,帮助提升SQL性能。

1. Mysql查询语句的书写顺序

Select [distinct ] <字段名称> from 表1 [ <join类型> join 表2 on <join条件> ] where <where条件> group by <字段>

having <having条件> order by <排序字段> limit <起始偏移量,行数>

2. Mysql查询语句的执行顺序

(8)Select(9)distinct 字段名1,字段名2,(7)[fun(字段名)](1)from 表1(3)<join类型>join 表2 (2)on <join条件> (4)where <where条件> (5)group by <字段> (6)having <having条件> (10)order by <排序字段> (11)limit <起始偏移量,行数>

3. Mysql 如何实现多表查询

MYSQL多表查询主要使用连接查询 , 连接查询的方式主要有 :

  • 内连接
  • 隐式内连接 : Select 字段 From 表A , 表B where 连接条件
  • 显式内连接 : Select 字段 From 表A inner join 表B on 连接条件
  • 外连接
  • 左外连接 : Select 字段 From 表A left join 表B on 连接条件
  • 右外连接 : Select 字段 From 表A right join 表B on 连接条件
  • 全外连接:(很少用)
  • 交叉连接 : (很少用)

4. MYSQL内连接和外连接的区别 ?

  • 内连接:只有两个元素表相匹配的才能在结果集中显示。
  • 外连接:左外连接: 左边为驱动表,驱动表的数据全部显示,匹配表的不匹配的不会显示。
  • 右外连接:右边为驱动表,驱动表的数据全部显示,匹配表的不匹配的不会显示。
  • 全外连接:连接的表中不匹配的数据全部会显示出来。
  • 交叉连接:笛卡尔效应,显示的结果是链接表数的乘积。

5. CHAR和VARCHAR的区别?

  1. char的长度是不可变的,用空格填充到指定长度大小,而varchar的长度是可变的。
  2. char的存取速度比varchar要快得多
  3. char的存储方式是:对英文字符(ASCII)占用1个字节,对一个汉字占用两个字节。varchar的存储方式是:对每个英文字符占用2个字节,汉字也占用2个字节。

6. 了解过Mysql的索引嘛 ?

MYSQL索引主要有 : 单列索引 , 组合索引空间索引 , 用的比较多的就是单列索引和组合索引 , 空间索引我这边没有用到过

单列索引 : 在MYSQL数据库表的某一列上面创建的索引叫单列索引 , 单列索引又分为

  • 普通索引:MySQL中基本索引类型,没有什么限制,允许在定义索引的列中插入重复值和空值,纯粹为了查询数据更快一点。
  • 唯一索引:索引列中的值必须是唯一的,但是允许为空值
  • 主键索引:是一种特殊的唯一索引,不允许有空值
  • 全文索引: 只有在MyISAM引擎、InnoDB(5.6以后)上才能使⽤用,而且只能在CHAR,VARCHAR,TEXT类型字段上使⽤用全⽂文索引。

组合索引 : 在MYSQL数据库表的多个字段组合上创建的索引 , 称为组合索引也叫联合索引

  • 组合索引的使用,需要遵循左前缀原则
  • 一般情况下,建议使用组合索引代替单列索引(主键索引除外)

7. 索引的底层数据结构了解过嘛 ?

索引是在存储引擎中实现的,也就是说不同的存储引擎,会使用不同的索引

MyISAM和InnoDB存储引擎:只⽀支持B+ TREE索引, 也就是说默认使用BTREE,不能够更换

MEMORY/HEAP存储引擎:支持HASH和BTREE索引

8. MYSQL支持的存储引擎有哪些, 有什么区别 ?

MYSQL存储引擎有很多, 常用的就二种 : MyISAMInnoDB , 者两种存储引擎的区别 ;

  • MyISAM支持256TB的数据存储 , InnoDB 只支持64TB的数据存储
  • MyISAM 不支持事务 , InnoDB 支持事务
  • MyISAM 不支持外键 , InnoDB 支持外键

9. 什么是聚簇索引什么是非聚簇索引 ?

聚簇索引

在使用InnoDB存储引擎的时候, 主键索引B+树叶子节点会存储数据行记录,简单来说数据和索引在一起存储 , 这就是聚簇索引

非聚簇索引

在使用MyISAM存储引擎的时候, B+树叶子节点只会存储数据行的指针,简单来说数据和索引不在一起 , 这就是非聚簇索引

10. 在一个非主键字段上创建了索引, 想要根据该字段查询到数据, 需要查询几次 ?

需要查询二次

如果使用MyISAM存储引擎 , 会首先根据索引查询到数据行指针, 再根据指针获取数据

如果是InnoDB存储引擎 , 会根据索引查找指定数据关联的主键ID , 再根据主键ID去主键索引中查找数据

11. 知道什么是回表查询嘛 ?

当我们为一张表的name字段建立了索引 , 执行如下查询语句 :

select name,age from user where name='Alice'

那么获取到数据的过程为 :

  1. 根据name='Alice'查找索引树 , 定位到匹配数据的主键值为id=18
  2. 根据id=18到主索引获取数据记录 (回表查询)

先定位主键值,再定位行记录就是所谓的回表查询,它的性能较扫一遍索引树低

12. 知道什么叫覆盖索引嘛 ?

覆盖索引是指只需要在一棵索引树上就能获取SQL所需的所有列数据 , 因为无需回表查询效率更高

实现覆盖索引的常见方法是:将被查询的字段,建立到联合索引里去。

执行如下查询语句 : select name,age from user where name='Alice'

因为要查询 nameage二个字段 , 那么我们可以建立组合索引

create index index_name_age on user(name,age)

那么索引存储结构如下 :

这种情况下, 执行select name,age from user where name='Alice' , 会先根据name='Alice', 找到记录 , 这条记录的索引上刚好又包含了 age 数据 , 直接把 Alice 77数据返回 , 就不会执行回表查询 , 这就是覆盖索引

13. 知道什么是左前缀原则嘛 ?

在mysql建立联合索引时会遵循左前缀匹配的原则,即最左优先,在检索数据时从联合索引的最左边开始匹配,组合索引的第一个字段必须出现在查询组句中,这个索引才会被用到 ;

例如 : create index index_age_name_sex on tb_user(age,name,sex);

上述SQL语句对 age,namesex建一个组合索引index_age_name_sex,实际上这条语句相当于建立了(age) , (age,name) , (age,name,sex)三个索引 .

select * from tb_user where age = 49 ;  -- 使用索引
select * from tb_user where age = 49 and name = 'Alice' ;  -- 使用索引
select * from tb_user where age = 49 and name = 'Alice' and sex = 'man';  -- 使用索引
select * from tb_user where age = 49  and sex = 'man';  -- 使用索引 , 但是只有 age 匹配索引 sex没有走索引
select * from tb_user where name = 'Alice' and age = 49 and sex = 'man' ;  -- 使用索引 ,  因为MySQL的查询优化器会自动调整 where 子句的条件顺序以使用适合的索引
select * from tb_user where name = 'Alice'  and sex = 'man' ;  -- 不会使用索引

14. 什么情况下索引会失效 ?

MySQL 索引通常是被用于提高 WHERE 条件的数据行匹配时的搜索速度,编写合理化的SQL能够提高SQL的执行效率

  1. 不要在列上使用函数和进行运算
  2. 不要在列上使用函数,这将导致索引失效而进行全表扫描。
  3. 尽量避免使用 != 或 not in或 <> 等否定操作符
  4. 尽量避免使用 or 来连接条件
  5. 多个单列索引并不是最佳选择,建立组合索引代替多个单列索引, 可以避免回表查询
  6. 查询中的某个列有范围查询,则其右边所有列都无法使用索引优化查找
  7. 索引不会包含有NULL值的列
  8. 当查询条件左右两侧类型不匹配的时候会发生隐式转换,隐式转换带来的影响就是可能导致索引失效而进行全表扫描。
  9. like 语句的索引失效问题like 的方式进行查询,在 like “value%” 可以使用索引,但是对于 like “%value%” 这样的方式,执行全表查询

15. 索引是越多越好嘛? 什么样的字段需要建索引, 什么样的字段不需要 ?

需要创建索引情况

  1. 主键自动建立主键索引
  2. 频繁作为查询条件的字段应该创建索引
  3. 多表关联查询中,关联字段应该创建索引 (on 两边都要创建索引)
  4. 查询中排序的字段,应该创建索引
  5. 频繁查找字段 , 应该创建索引
  6. 查询中统计或者分组字段,应该创建索引

不要创建索引情况

  1. 表记录太少
  2. 经常进⾏行行增删改操作的表
  3. 频繁更新的字段
  4. where条件里使用频率不高的字段
相关文章
|
5月前
|
人工智能 JavaScript Linux
OpenClaw阿里云/本地部署保姆级图文指南:免费大模型APi配置+核心命令详解+高效使用技巧
OpenClaw作为轻量化AI智能体框架,除自然语言交互外,命令行操作可大幅提升会话管理、模型切换、服务监控效率,以下10组高频命令覆盖日常使用全场景,配合飞书等IM工具可实现无感高效协作。
2331 1
|
30天前
|
机器学习/深度学习 人工智能 安全
7天AI大事速览:一篇看完,比别人少刷50篇碎片信息
过去7天AI圈风云突变:Anthropic冲刺万亿级IPO、旗舰模型遭美政府临时下线又部分解禁;Google发布表格AI TabFM、医疗AI登顶《Nature》;ICML首尔大会聚焦推理本质与多智能体瓶颈;美团开源1.6万亿参数国产模型。技术狂奔,监管趋严,落地加速。
266 1
|
2月前
|
人工智能 自然语言处理 数据挖掘
AI时代的个人知识管理:从知识库、SOP到OPC一人公司
本文探讨AI时代下的个人知识管理新范式——OPC一人公司:它并非法律意义的单人企业,而是以目标判断为核、AI为辅、知识库为基、SOP为纲、复盘为钥的可复用工作系统。强调经验沉淀、流程自动化与持续优化,助力个体实现部门级任务处理能力。
380 4
|
9月前
|
JavaScript 前端开发 安全
JavaScript 数组扁平化:四种方法详解与最佳实践
本文详解JavaScript数组扁平化的四种主流方法:`flat()`、扩展运算符+`concat`、`reduce`和`for...of`循环,从语法、性能、兼容性等维度对比分析,结合适用场景与最佳实践,助你高效处理嵌套数组。
585 9
|
3月前
|
JSON 供应链 API
企业级实战:1688 图搜接口(item_search_img / 拍立淘) 接入方法
1688图搜API(item_search_img/拍立淘)支持以图搜货,传入图片URL或Base64,返回同款/相似B2B商品(含offerId、价格、起批量等)。含官方入口、完整参数、签名规则、Python调用示例、接入步骤及避坑指南,开箱即用。
|
4月前
|
人工智能 机器人 视频直播
别再手动画表情包了!AI 一键把照片做成会动的表情包视频
还在为做专属表情包发愁?2026年AI表情包生成API来了!上传一张图,秒变魔性动态表情包——自动人脸检测、智能模板匹配、1秒出片。零剪辑基础,支持自拍/宠物/网图,适配聊天、短视频、直播等多场景。开发者可直接调用,极简接口,高效集成。
477 0
|
4月前
|
索引 Python Windows
别再手动调PPT了:用Python批量生成文本框,还能自动排版
小张苦于每周手动制作PPT周报。本文介绍如何用Python库`python-pptx`自动化生成格式统一的周报:从创建文本框、精细控制字体/颜色/对齐,到实现多级列表、模板占位符替换,助运营人员告别重复劳动,5分钟搞定周报。(239字)
405 0
|
7月前
|
人工智能 算法 API
在2026这个AI元年中现在入局,必须看清的3个价值锚点与2个核心能力栈
当AI与云深度融合,“AI云”正成为技术新主流。2026年,算力、模型与服务将全面融合,开发者需从“调优虚拟机”转向“组装AI服务链”。看清价值锚点,构建云原生AI能力栈,以场景驱动实现转型,卡位未来十年技术浪潮的关键生态位。
442 2
|
8月前
|
监控 Java 测试技术
OOM排查之路:一次曲折的线上故障复盘
本文记录了一次Paimon数据湖与RocksDB集成服务线上频繁OOM的排查历程。通过分析线程暴增、堆外内存泄漏,最终定位到SDK中RocksDB的JNI内存未释放问题,并借助Flink重构写入链路彻底解决。分享了MAT、NMT、async-profiler等工具的实战经验与排查思路,为类似技术栈提供借鉴。
OOM排查之路:一次曲折的线上故障复盘
|
8月前
|
人工智能 JSON 数据挖掘
大模型应用开发中MCP与Function Call的关系与区别
MCP与Function Call是大模型应用中两大关键技术。前者为跨模型标准化通信协议,实现工具与模型解耦;后者是模型调用外部功能的内置机制。二者互补协作,推动AI应用向更开放、灵活、可扩展的方向发展。