📖
R‘Notes
  • 关于本仓库/网站
  • Note
    • Golang的知识碎片
      • 关于Golang的一些碎片知识
    • LeetCode
      • LCR 121. 寻找目标值 - 二维数组
      • LCR 125. 图书整理 II
      • LCR 127. 跳跃训练
      • LCR 143. 子结构判断
      • LCR 159. 库存管理 III
      • LCR 161. 连续天数的最高销售额
      • LCR 170. 交易逆序对的总数
      • LCR 174. 寻找二叉搜索树中的目标节点
      • LeetCode--1. 两数之和
      • LeetCode--10. 正则表达式匹配
      • LeetCode--1004. 最大连续1的个数 III
      • LeetCode--101. 对称二叉树
      • LeetCode--102. 二叉树的层序遍历
      • LeetCode--1027. 最长等差数列
      • LeetCode--103. 二叉树的锯齿形层序遍历
      • LeetCode--1035. 不相交的线
      • LeetCode--104. 二叉树的最大深度
      • LeetCode--1044. 最长重复子串
      • LeetCode--105. 从前序与中序遍历序列构造二叉树
      • LeetCode--106. 从中序与后序遍历序列构造二叉树
      • LeetCode--110. 平衡二叉树
      • LeetCode--111. 二叉树的最小深度
      • LeetCode--112. 路径总和
      • LeetCode--113. 路径总和 II
      • LeetCode--1137. 第 N 个泰波那契数
      • LeetCode--114. 二叉树展开为链表
      • LeetCode--1143. 最长公共子序列
      • LeetCode--115. 不同的子序列
      • LeetCode--1191. K 次串联后最大子数组之和
      • LeetCode--120. 三角形最小路径和
      • LeetCode--121. 买卖股票的最佳时机
      • LeetCode--1218. 最长定差子序列
      • LeetCode--122. 买卖股票的最佳时机 II
      • LeetCode--1220. 统计元音字母序列的数目
      • LeetCode--123. 买卖股票的最佳时机 III
      • LeetCode--124. 二叉树中的最大路径和
      • LeetCode--125. 验证回文串
      • LeetCode--128. 最长连续序列
      • LeetCode--1289. 下降路径最小和 II
      • LeetCode--129. 求根节点到叶节点数字之和
      • LeetCode--1301. 最大得分的路径数目
      • LeetCode--1312. 让字符串成为回文串的最少插入次数
      • LeetCode--134. 加油站
      • LeetCode--135. 分发糖果
      • LeetCode--136. 只出现一次的数字
      • LeetCode--138. 随机链表的复制
      • LeetCode--139. 单词拆分
      • LeetCode--14. 最长公共前缀
      • LeetCode--141. 环形链表
      • LeetCode--142. 环形链表 II
      • LeetCode--143. 重排链表
      • LeetCode--144. 二叉树的前序遍历
      • LeetCode--145. 二叉树的后序遍历
      • LeetCode--146. LRU 缓存
      • LeetCode--148. 排序链表
      • LeetCode--15. 三数之和
      • LeetCode--151. 反转字符串中的单词
      • LeetCode--152. 最大乘积子数组【DP】
      • LeetCode--153. 寻找旋转排序数组中的最小值
      • LeetCode--155. 最小栈
      • LeetCode--1584. 连接所有点的最小费用,最小生成树模板题
      • LeetCode--1594. 矩阵的最大非负积
      • LeetCode--16. 最接近的三数之和
      • LeetCode--160. 相交链表
      • LeetCode--162. 寻找峰值
      • LeetCode--165. 比较版本号
      • LeetCode--169. 多数元素
      • LeetCode--174. 地下城游戏
      • LeetCode--179. 最大数
      • LeetCode--1824. 最少侧跳次数
      • LeetCode--188. 买卖股票的最佳时机 IV
      • LeetCode--189. 轮转数组
      • LeetCode--19. 删除链表的倒数第 N 个结点,关于删除链表会遇见的指针问题
      • LeetCode--1964. 找出到每个位置为止最长的有效障碍赛跑路线
      • LeetCode--198. 打家劫舍
      • LeetCode--199. 二叉树的右视图
      • LeetCode--2. 两数相加
      • LeetCode--20. 有效的括号
      • LeetCode--200. 岛屿数量
      • LeetCode--206. 反转链表
      • LeetCode--207. 课程表
      • LeetCode--208. 实现 Trie (前缀树)
      • LeetCode--209. 长度最小的子数组
      • LeetCode--21. 合并两个有序链表,关于链表的复习
      • LeetCode--210. 课程表 II
      • LeetCode--213. 打家劫舍 II
      • LeetCode--2140. 解决智力问题
      • LeetCode--215. 数组中的第K个最大元素
      • LeetCode--22. 括号生成
      • LeetCode--221. 最大正方形
      • LeetCode--2218. 从栈中取出 K 个硬币的最大面值和
      • LeetCode--224. 基本计算器
      • LeetCode--225. 用队列实现栈
      • LeetCode--226. 翻转二叉树
      • LeetCode--2266. 统计打字方案数
      • LeetCode--227. 基本计算器 II
      • LeetCode--23. 合并 K 个升序链表【堆和分治】
      • LeetCode--230. 二叉搜索树中第 K 小的元素
      • LeetCode--2304. 网格中的最小路径代价
      • LeetCode--232. 用栈实现队列
      • LeetCode--2320. 统计放置房子的方式数
      • LeetCode--2321. 拼接数组的最大分数
      • LeetCode--233. 数字 1 的个数
      • LeetCode--234. 回文链表
      • LeetCode--236. 二叉树的最近公共祖先
      • LeetCode--239. 滑动窗口最大值,关于单调队列的复习
      • LeetCode--24. 两两交换链表中的节点
      • LeetCode--240. 搜索二维矩阵 II
      • LeetCode--2435. 矩阵中和能被 K 整除的路径
      • LeetCode--2466. 统计构造好字符串的方案数
      • LeetCode--25. K 个一组翻转链表
      • LeetCode--2533. 好二进制字符串的数量
      • LeetCode--256. 粉刷房子
      • LeetCode--2606. 找到最大开销的子字符串
      • LeetCode--265. 粉刷房子 II
      • LeetCode--2684. 矩阵中移动的最大次数
      • LeetCode--279. 完全平方数【动态规划】
      • LeetCode--283. 移动零
      • LeetCode--287. 寻找重复数
      • LeetCode--295. 数据流的中位数
      • LeetCode--297. 二叉树的序列化与反序列化
      • LeetCode--3. 无重复字符的最长子串
      • LeetCode--300. 最长递增子序列【DP+二分】
      • LeetCode--309. 买卖股票的最佳时机含冷冻期
      • LeetCode--31. 下一个排列
      • LeetCode--3186. 施咒的最大总伤害
      • LeetCode--32. 最长有效括号【栈和dp】
      • LeetCode--322. 零钱兑换
      • LeetCode--328. 奇偶链表
      • LeetCode--329. 矩阵中的最长递增路径
      • LeetCode--33. 搜索旋转排序数组【直接二分】
      • LeetCode--337. 打家劫舍 III
      • LeetCode--3393. 统计异或值为给定值的路径数目
      • LeetCode--34. 在排序数组中查找元素的第一个和最后一个位置
      • LeetCode--3418. 机器人可以获得的最大金币数
      • LeetCode--343. 整数拆分
      • LeetCode--347. 前 K 个高频元素
      • LeetCode--347. 前 K 个高频元素Golang中的堆(containerheap)
      • LeetCode--354. 俄罗斯套娃信封问题
      • LeetCode--377. 组合总和 Ⅳ
      • LeetCode--39. 组合总和
      • LeetCode--394. 字符串解码【栈】
      • LeetCode--395. 至少有 K 个重复字符的最长子串
      • LeetCode--4. 寻找两个正序数组的中位数
      • LeetCode--40. 组合总和 II
      • LeetCode--402. 移掉 K 位数字
      • LeetCode--41. 缺失的第一个正数
      • LeetCode--415. 字符串相加
      • LeetCode--416. 分割等和子集_494. 目标和【01背包】
      • LeetCode--42. 接雨水(单调栈和双指针)
      • LeetCode--426. 将二叉搜索树转化为排序的双向链表
      • LeetCode--43. 字符串相乘
      • LeetCode--437. 路径总和 III【前缀和】
      • LeetCode--44. 通配符匹配
      • LeetCode--440. 字典序的第K小数字
      • LeetCode--442. 数组中重复的数据
      • LeetCode--445. 两数相加 II
      • LeetCode--45. 跳跃游戏 II
      • LeetCode--450. 删除二叉搜索树中的节点
      • LeetCode--46. 全排列
      • LeetCode--460. LFU 缓存
      • LeetCode--468. 验证IP地址
      • LeetCode--470. 用 Rand7() 实现 Rand10()
      • LeetCode--474. 一和零
      • LeetCode--48. 旋转图像
      • LeetCode--498. 对角线遍历
      • LeetCode--5. 最长回文子串
      • LeetCode--50. Pow(x, n)
      • LeetCode--509. 斐波那契数
      • LeetCode--516. 最长回文子序列
      • LeetCode--518. 零钱兑换 II
      • LeetCode--529. 扫雷游戏题解C++广搜
      • LeetCode--53. 最大子数组和
      • LeetCode--54. 螺旋矩阵
      • LeetCode--540. 有序数组中的单一元素
      • LeetCode--543. 二叉树的直径
      • LeetCode--55. 跳跃游戏
      • LeetCode--556. 下一个更大元素 III
      • LeetCode--56. 合并区间
      • LeetCode--560. 和为 K 的子数组
      • LeetCode--572. 另一棵树的子树
      • LeetCode--59. 螺旋矩阵 II
      • LeetCode--61. 旋转链表
      • LeetCode--62. 不同路径
      • LeetCode--622. 设计循环队列
      • LeetCode--63. 不同路径 II
      • LeetCode--64. 最小路径和
      • LeetCode--646. 最长数对链
      • LeetCode--662. 二叉树最大宽度
      • LeetCode--673. 最长递增子序列的个数
      • LeetCode--678. 有效的括号字符串
      • LeetCode--679. 24 点游戏
      • LeetCode--69. x 的平方根
      • LeetCode--695. 岛屿的最大面积
      • LeetCode--7. 整数反转
      • LeetCode--70. 爬楼梯
      • LeetCode--704. 二分查找
      • LeetCode--712. 两个字符串的最小ASCII删除和
      • LeetCode--714. 买卖股票的最佳时机含手续费
      • LeetCode--718. 最长重复子数组
      • LeetCode--72. 编辑距离
      • LeetCode--739. 每日温度
      • LeetCode--74. 搜索二维矩阵
      • LeetCode--740. 删除并获得点数
      • LeetCode--746. 使用最小花费爬楼梯
      • LeetCode--75. 颜色分类
      • LeetCode--76. 最小覆盖子串
      • LeetCode--77. 组合
      • LeetCode--78. 子集
      • LeetCode--79. 单词搜索
      • LeetCode--790. 多米诺和托米诺平铺
      • LeetCode--8. 字符串转换整数 (atoi)
      • LeetCode--82. 删除排序链表中的重复元素 II
      • LeetCode--83. 删除排序链表中的重复元素
      • LeetCode--84. 柱状图中最大的矩形【单调栈】
      • LeetCode--85. 最大矩形
      • LeetCode--87. 扰乱字符串
      • LeetCode--88. 合并两个有序数组
      • LeetCode--887. 鸡蛋掉落
      • LeetCode--91. 解码方法
      • LeetCode--912. 排序数组
      • LeetCode--918. 环形子数组的最大和
      • LeetCode--92. 反转链表 II
      • LeetCode--93. 复原 IP 地址
      • LeetCode--931. 下降路径最小和
      • LeetCode--94. 二叉树的中序遍历
      • LeetCode--958. 二叉树的完全性检验
      • LeetCode--97. 交错字符串
      • LeetCode--98. 验证二叉搜索树
      • LeetCode--983. 最低票价
      • LeetCode--LCR 140. 训练计划 II
      • NC--311.圆环回原点
      • NC--36进制加法
      • 补充题1. 排序奇升偶降链表
    • Redis
      • Redis基础部分
      • 在用Docker配置Redis哨兵节点的时候出现的错误及其解决
    • SQL学习记录
      • SQL碎片知识
      • 系统
        • MySQL学习笔记1【DQL和DCL】
        • MySQL学习笔记2【函数/约束/多表查询】
        • MySQL学习笔记3【事务】
        • MySQL学习笔记4【存储引擎和索引】
        • MySQL学习笔记5【SQL优化/视图/存储过程/触发器】
        • MySQL学习笔记6【锁】
        • MySQL学习笔记7【InnoDB】
    • x86汇编
      • 学习汇编随手记
    • 微服务相关
      • Nacos与gRPC
      • 【Golangnacos】nacos配置的增删查改,以及服务注册的golang实例及分析
    • 手搓
      • Whalebox(仿Docker)的爆诞
    • 操作系统
      • MIT6.S081-lab1
      • MIT6.S081-lab2
      • MIT6.S081-lab3
      • MIT6.S081-lab3前置
      • MIT6.S081-lab4
      • MIT6.S081-lab4前置
      • MIT6.S081-lab5
      • MIT6.S081-lab5前置
      • MIT6.S081-lab7
      • MIT6.S081-lab7前置
      • MIT6.S081-lab8
      • MIT6.S081-lab8前置
      • MIT6.S081-lab9
      • MIT6.S081-环境搭建
    • 消息队列MQ
      • Kafka
    • 算法杂谈
      • 关于二分查找时的边界分类问题
    • 计组笔记
      • 计算机组成原理的学习笔记(1)--概述
      • 计算机组成原理的学习笔记(10)--CPU·其二 组合逻辑控制器和微程序
      • 计算机组成原理的学习笔记(11)--CPU·其三 中断和异常多处理器相关概念
      • 计算机组成原理的学习笔记(12)--总线和IO系统
      • 计算机组成原理的学习笔记(2)--数据的表示和运算·其一
      • 计算机组成原理的学习笔记(3)--数据表示与运算·其二 逻辑门和加减乘
      • 计算机组成原理的学习笔记(4)--数据的表示与运算·其三 补码的乘法以及原码补码的除法
      • 计算机组成原理的学习笔记(4)--数据的表示与运算·其三 补码的乘法以及原码补码的除法
      • 计算机组成原理的学习笔记(6)--存储器·其一 SRAMDRAMROM主存储器的初步认识
      • 计算机组成原理的学习笔记(7)--存储器·其二 容量扩展多模块存储系统外存Cache虚拟存储器
      • 计算机组成原理的学习笔记(8)--指令系统·其一 指令的组成以及数据寻址方式RISK和CISK
      • 计算机组成原理的学习笔记(9)--CPU·其一 CPU的基本概念流水线技术数据通路
    • 闲聊
      • 2025-03-23记
      • 大一上总结
由 GitBook 提供支持
在本页
  • 存储引擎
  • 1. 常用的存储引擎
  • 2. 存储引擎比较表
  • 3. 相关操作
  • 4. 选择
  • 索引
  • 1. 优缺点
  • 2. 索引结构及支持
  • 3. 数据结构比较
  • 4. Hash 索引原理
  • 5. 存储引擎支持情况
  • 6. MySQL 索引分类
  • 7. 存储引擎中的索引形式
  • 8. 聚集索引选取规则
  • 9.性能分析
  1. Note
  2. SQL学习记录
  3. 系统

MySQL学习笔记4【存储引擎和索引】


存储引擎

1. 常用的存储引擎

  1. InnoDB

    • 特点:

      • 支持事务(遵循ACID模型)。

      • 实现行级锁,提高并发性能。

      • 支持外键约束,确保数据完整性。

    • 文件结构:

      • xxx.ibd: 存储数据和索引。

      • 表结构文件(frm、sdi)也与之相关。

    • 其他参数:

      • innodb_file_per_table: 决定每张表是否有独立表空间。

    • 使用场景:适用于需要高可靠性和高并发访问的应用程序。

  2. MyISAM

    • 特点:

      • 不支持事务和外键。

      • 使用表级锁,不能支持行级锁。

      • 访问速度快,适合读多写少的场景。

    • 文件结构:

      • xxx.sdi: 存储表结构信息。

      • xxx.MYD: 存储数据。

      • xxx.MYI: 存储索引。

    • 使用场景:适用于以数据读取为主,且不需要事务支持的应用。

  3. Memory

    • 特点:

      • 数据存放在内存中,速度极快。

      • 受到硬件问题和断电的影响,适合用作临时表或缓存。

    • 文件结构:存放在内存中,不生成物理文件。

    • 使用场景:适用于需要快速访问的临时数据存储。

2. 存储引擎比较表

特点
InnoDB
MyISAM
Memory

存储限制

64TB

有

有

事务安全

支持

-

-

锁机制

行锁

表锁

表锁

B+树索引

支持

支持

支持

哈希索引

-

-

支持

全文索引

支持(5.6版本后)

支持

-

空间使用

高

低

N/A

内存使用

高

低

中等

批量插入速度

低

高

高

支持外键

支持

-

-

3. 相关操作

  • 查看建表语句:

    SHOW CREATE TABLE account;
  • 建表时指定存储引擎:

    CREATE TABLE 表名 (
        ...
    ) ENGINE=INNODB;
  • 查看当前数据库支持的存储引擎:

    SHOW ENGINES;
  • 查看 MySQL 变量:

    SHOW VARIABLES LIKE 'innodb_file_per_table';
  • 从 .ibd 文件提取表结构数据:

    ibd2sdi xxx.ibd

4. 选择

存储引擎
特点
适用场景

InnoDB

- 事务完整性要求高

如果应用对事务的完整性有比较高的要求,且在并发条件下要求数据一致性。

- 支持多种数据操作(插入、查询、更新、删除)

适用于包括大量更新和删除操作的应用。

MyISAM

- 读操作和插入操作为主,更新和删除操作非常少

如果应用主要以读操作和插入操作为主,且对事务的完整性、并发性要求不高。

- 不支持事务和外键

适用于不需要事务支持的场景。

Memory

- 所有数据保存在内存中,访问速度极快

适用于需要快速访问的临时表和缓存(不如Redis)。

- 对表的大小有限制,太大的表无法缓存在内存中

Memory 的缺陷是无法保障数据的安全性。

- 不生成物理文件


索引

内容

索引定义

索引是帮助 MySQL 高效获取数据的数据结构,通常是有序的。

工作原理

数据库系统维护特定查找算法的数据结构以引用数据,提升查询效率。

1. 优缺点

优缺点
描述

优点

1. 提高数据检索效率,降低数据库的 I/O 成本。 2. 利用索引列对数据排序,降低排序成本,降低 CPU 的消耗。

缺点

1. 索引需要占用额外空间。 2. 更新(INSERT/UPDATE/DELETE)操作速度降低。

2. 索引结构及支持

索引结构
描述
InnoDB
MyISAM
Memory

B+Tree

最常见的索引类型,支持范围查询。

支持

支持

支持

Hash

哈希表实现,仅支持精确匹配,无法支持范围查询。

不支持

不支持

支持

R-Tree

主要用于地理空间数据,适用于范围查询。

不支持

支持

不支持

Full-Text

文本搜索,通过倒排索引快速匹配文档。

5.6版本后支持

支持

不支持

3. 数据结构比较

数据结构
描述

B-Tree

多路平衡查找树,节点可存储多个关键字。

B+Tree

所有数据在叶子节点,形成链表,适合范围查询,优化区间访问性能。

4. Hash 索引原理

特点
描述

适用场景

仅能用于等值比较(=、IN),不支持范围查询(BETWEEN、>、<)。

排序操作

无法通过索引完成排序操作。

查询效率

查询通常只需一次检索,效率高于 B+Tree 索引。

5. 存储引擎支持情况

存储引擎
特点

Memory

支持 Hash 索引。

InnoDB

自适应 Hash 功能,在特定条件下自动构建的 Hash 索引。

6. MySQL 索引分类

分类
含义
特点
关键字

主键索引

针对表中主键创建的索引

默认自动创建,只能有一个

PRIMARY

唯一索引

避免同一表中重复数据

可以有多个

UNIQUE

常规索引

快速定位特定数据

可以有多个

全文索引

根据文本中的关键词查找,而非索引中的值

可以有多个

FULLTEXT

7. 存储引擎中的索引形式

在 InnoDB 存储引擎中,索引还可以按照其存储形式分为以下两种:

分类
含义
特点

聚集索引

将数据存储与索引放在一起,叶子节点保存行数据

每个表必须有且只有一个,查询效率高,直接访问数据行,适合范围查询。

二级索引

将数据与索引分开存储,叶子节点关联主键

可以存在多个,查询时需进行两次查找:一次是查找二级索引,另一次是通过主键查找数据。

tip:根据特点,我们可以知道根据主键查找会更快,如果通过其他字段来查找数据,这个字段就会作为一个二级索引,查找到相应的主键(聚集索引)后,通过回表查询来再在聚集索引中查询相应的行数据。

8. 聚集索引选取规则

  1. 如果存在主键,主键索引即为聚集索引。

  2. 如果没有主键,将使用第一个唯一索引作为聚集索引。

  3. 如果表没有主键或可用的唯一索引,InnoDB 会生成一个自动隐藏的 rowid 作为聚集索引。

9.性能分析

性能分析是数据库优化的重要环节,以下是关于 MySQL 中一些常用的性能分析工具和方法:

9.1 查看执行频次

可以通过以下命令查看当前数据库中的 INSERT、UPDATE、DELETE 和 SELECT 的访问频次:

  • 全局状态:

    SHOW GLOBAL STATUS LIKE 'Com_______';
  • 会话状态:

    SHOW SESSION STATUS LIKE 'Com_______';

9.2 慢查询日志

慢查询日志用于记录执行时间超过指定阈值的 SQL 语句。配置步骤如下:

  • 在 MySQL 配置文件(通常是 /etc/my.cnf)中添加以下配置:

    # 开启慢查询日志
    slow_query_log=1
    # 设置慢查询时间为2秒
    long_query_time=2
  • 配置完成后,重启 MySQL 服务。慢查询日志的默认存储路径为:/var/lib/mysql/localhost-slow.log。

  • 注意,这里的默认存储文件每个人可能不一样,如果没找到查看mysql的配置文件或者实在不行可以问AI来解决。

9.3 查看慢查询日志开关状态

SHOW VARIABLES LIKE 'slow_query_log';

9.4 Profiling

Profiling 是用于分析 SQL 查询性能的工具。

  • 检查 MySQL 是否支持 Profiling:

    SELECT @@have_profiling;
  • 开启 Profiling(会话或全局):

    SET profiling = 1;
  • 查看所有 SQL 语句的耗时:

    SHOW PROFILES;
  • 查看指定 query_id 的 SQL 语句耗时:

    SHOW PROFILE FOR QUERY query_id;
  • 查看指定 query_id 的 SQL 语句 CPU 使用情况:

    SHOW PROFILE CPU FOR QUERY query_id;

9.5 Explain

使用 EXPLAIN 或 DESC 命令可以获取 MySQL 如何执行 SELECT 语句的信息。

  • 语法示例:

    EXPLAIN 
    SELECT 字段列表 
    FROM 表名 
    WHERE 条件;

EXPLAIN 各字段含义:

  • id:查询的序列号,表示执行顺序。

  • select_type:表示 SELECT 的类型,如 SIMPLE、PRIMARY、UNION、SUBQUERY 等。

  • type:连接类型,性能由好到差依次为 NULL(不访问任何表)、system(访问系统表)、const(主键或唯一索引)、eq_ref(查询通过主键或唯一索引进行等值连接)、ref(非唯一性索引)、range(通过索引进行范围扫描)、index(查询通过扫描整个索引树来获取数据)、all(全表遍历)。(一半在优化的时候是难以达到NULL的级别,但是尽可能向左优化)。

  • possible_key:可能应用的索引列表。

  • Key:实际使用的索引,若为 NULL 则没有使用索引。

  • Key_len:使用的索引字节数,越短越好。

  • rows:估计需要执行的行数。

  • filtered:返回结果行数占需读取行数的百分比,值越大越好。

9.6 索引的使用

1. 语法

  1. 创建索引:

    • 语法:

      CREATE [ UNIQUE | FULLTEXT ] INDEX index_name ON table_name (index_col_name, ...);
    • 示例:

      CREATE INDEX idx_user_name ON tb_user(name);
      CREATE UNIQUE INDEX idx_user_phone ON tb_user (phone);
      CREATE INDEX idx_user_pro_age_stat ON tb_user(profession, age, status); #联合索引
      CREATE INDEX idx_user_email ON tb_user(email);
  2. 查看索引:

    • 语法:

      SHOW INDEX FROM table_name;
  3. 删除索引:

    • 语法:

      DROP INDEX index_name ON table_name;

2. 使用规则

  • 最左前缀法则: 查询条件应从索引的最左列开始,跳过某一列将导致索引的部分失效。

  • 范围查询影响: 联合索引中一旦出现范围查询(如 <, >),该范围右侧的列索引将失效。

  • 索引失效情况:

    • 在索引列上进行运算操作(例如 substring(phone, 10, 2))。

    • 字符串类型字段不加引号时索引失效(如 where phone = 17799990015)。

    • 模糊查询中,前部模糊匹配将使索引失效,比如 LIKE '%工程'。

    • 使用 OR 时,如果其中一个条件的列没有索引,涉及的索引都可能不会被使用。

3. SQL优化提示

  • 使用提示:

    • USE INDEX:建议使用的索引

    • IGNORE INDEX:不使用的索引

    • FORCE INDEX:强制使用指定的索引

  • 覆盖索引与回表查询:

    • 尽量使用覆盖索引,避免 SELECT *,以减少回表查询的次数。

4. 前缀索引

  • 用于长字符串的索引,可以只建立部分前缀索引来节约空间,提高效率。

5. 单列索引与联合索引

  • 建议在常用的查询条件上建立联合索引。

  • 单列索引适用于简单查询条件。

6. 注意事项

  • 对于频繁查询且数据量大的字段应建立索引。

  • 使用区分度高的列作为索引可以提高效率。

  • 避免过多索引,以免影响增删改的性能。


上一页MySQL学习笔记3【事务】下一页MySQL学习笔记5【SQL优化/视图/存储过程/触发器】

最后更新于1天前