MySQL索引
前言
局部性原理:
- 时间局部性
- 程序中的某条指令一旦执行,不久后该指令可能再次执行;某数据被访问过,不久后该数据可能再次被访问。产生时间局部性的典型原因是程序中存在着大量的循环操作。
- 时间局部性通过将近来使用的指令和数据保存到高速缓冲存储器中,并使用高速缓存的层次结构实现。
- 空间局部性
- 一旦程序访问了某个存储单元,在不久后,其附近的存储单元也将被访问,即程序在一段时间内所访问的地址,可能集中在一定的范围之内,因为指令通常是顺序存放、顺序执行的,数据也一般是以向量、数组、表等形式簇聚存储的。
- 空间局部性通常使用较大的高速缓存,并将预取机制集成到高速缓存控制逻辑中实现。
SQL定义与执行顺序:
sql语句定义的顺序
(1) SELECT (2) DISTINCT<select_list> (3) FROM <left_table> (4) <join_type> JOIN <right_table> (5) ON <join_condition> (6) WHERE <where_condition> (7) GROUP BY <group_by_list> (8) WITH {CUBE|ROLLUP} (9) HAVING <having_condition> (10) ORDER BY <order_by_condition> (11) LIMIT <limit_number> sql语句执行顺序
(8) SELECT (9)DISTINCT<select_list> (1) FROM <left_table> (3) <join_type> JOIN <right_table> (2) ON <join_condition> (4) WHERE <where_condition> (5) GROUP BY <group_by_list> (6) WITH {CUBE|ROLLUP} (7) HAVING <having_condition> (10) ORDER BY <order_by_list> (11) LIMIT <limit_number>
每个操作都会产生一个虚拟表,该虚拟表作为一个处理的输入,看下执行顺序:
(1) FROM: 对FROM子句中的左表<left_table>和右表<right_table>执行笛卡儿积,产生虚拟表VT1;
(2) ON: 对虚拟表VT1进行ON筛选,只有那些符合<join_condition>的行才被插入虚拟表VT2;
(3) JOIN:如果指定了OUTER JOIN(如LEFT OUTER JOIN、RIGHT OUTER JOIN),那么保留表中未匹配的行作为外部行添加到虚拟表VT2,产生虚拟表VT3。如果FROM子句包含两个以上的表,则对上一个连接生成的结果表VT3和下一个表重复执行步骤1~步骤3,直到处理完所有的表;
(4) WHERE: 对虚拟表VT3应用WHERE过滤条件,只有符合<where_condition>的记录才会被插入虚拟表VT4;
(5) GROUP By: 根据GROUP BY子句中的列,对VT4中的记录进行分组操作,产生VT5;
(6) CUBE|ROllUP: 对VT5进行CUBE或ROLLUP操作,产生表VT6;
(7) HAVING:对虚拟表VT6应用HAVING过滤器,只有符合<having_condition>的记录才会被插入到VT7;
(8) SELECT:第二次执行SELECT操作,选择指定的列,插入到虚拟表VT8中;
(9) DISTINCT: 去除重复,产生虚拟表VT9;
(10)ORDER BY: 将虚拟表VT9中的记录按照<order_by_list>进行排序操作,产生虚拟表VT10;
(11) LIMIT:取出指定街行的记录,产生虚拟表VT11,并返回给查询用户
数据库在未添加索引的时候进行查询默认的是进行全量搜索,也就是进行全局扫描,这样效率就会非常低
B+树
MySQL存储引擎
InnoDB 和 MyISAM是市面上比较常用的两种存储引擎
InnoDB 和 MyISAM区别:
- InnoDB支持主外键、事务;
- InnoDB是行锁,操作时候只锁一行数据,适合高并发;MyISAM是表索;
- InnoDB不仅缓存索引,还缓存真实数据;MyISAM只缓存索引;
- InnoDB需要表空间大;
- InnoDB关注事务,MyISAM关注性能(查);
概述
什么是索引
索引是对数据库表中一列或多列的值进行排序的一种结构(可以参照书的目录来理解),使用索引可快速访问数据库表中的特定信息。
实现原理
索引一般以文件形式存在磁盘中(也可以存于内存中),存储的索引的原理大致概括为以空间换时间。建立索引之后,会将建立索引的KEY值放在一个树上,每次以索引进行条件查询时,会去树上根据key值直接进行搜索。
MySQL为什么采用B+树作为底层实现?
- 二叉树左右子树高度相差太大时,进行的比较次数很多,IO开销太大
- 平衡二叉树和红黑树,也会对比很多次,而且会出现树高的问题,且每插入一个值将进行重平衡,非常的费时。
- B树虽然解决树高的问题,但是范围查询的代价也很大
- B+树解决了树高和范围查询的问题,但是空间消耗大
索引的优缺点
- 优点
-
建立索引的列可以保证行的唯一性
-
建立索引可以有效缩短数据的检索时间
-
建立索引可以加快表与表之间的连接
-
为用来排序或者是分组的字段添加索引可以加快分组和排序顺序
- 缺点
-
创建索引和维护索引需要时间成本,这个成本随着数据量的增加而加大
-
创建索引和维护索引需要空间成本,每一条索引都要占据数据库的物理存储空间,数据量越大,占用空间也越大(数据表占据的是数据库的数据空间)
-
会降低表的增删改的效率,因为每次增删改索引需要进行动态维护,导致时间变长
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix