96SEO 2026-02-19 18:57 19
SQL查询语句的执行顺序以及JOIN的使用。

作为一种声明式编程语言,SQL的执行顺序和我们编写的语句顺序并不完全相同。
理解SQL的执行顺序,有助于使用者更好地优化查询语句,提高查询效率。
此外,SQL中的JOIN语句是非常重要和常用的,用于关联多个表进行查询。
SQL是一种声明式的编程语言。
这意味着使用者在编写SQL查询语句时,只需要指定想要的结果,而不需要关心具体的实现步骤。
数据库系统会根据最优的执行计划来执行使用者的查询。
JOIN子句如果有的话根据JOIN类型如INNER、LEFT连接表
首先根据FROM后边的前两个表做一个笛卡尔积生成虚拟表table1对应步骤1中的from然后根据ON语句的条件对table1进行筛选生成table2对应步骤1中的on然后根据连接关键字Left、Right、Outer等对table2进行补充形成table3对应步骤1中的join如果超过两张表就重复1-3最终形成虚拟表table4
通过where语句进行筛选形成虚拟表table5对应步骤2条件是订单的创建时间(create_time)在2023-01-01到2023-12-31之间。
这一步删除了不在指定时间范围内的订单数据。
虚拟表table6对应步骤3将上一步的结果集按照用户所在地区(region)进行分组。
这一步将相同地区的用户订单信息聚合在一起。
BY对分组后的结果集进一步过滤。
条件是每个地区的总订单金额大于1000000。
这一步删除了消费总额不满足条件的地区。
DISTINCT子句去除重复数据。
函数对列做特殊运算选择结果集中需要保留的列,包括地区(region)和总金额(total_amount)。
其中总金额是通过SUM(o.amount)计算得到的。
by子句此时返回的一个游标对应步骤6按照总金额(total_amount)对结果集进行倒序排序。
这一步将消费总额高的地区排在前面。
LIMIT:LIMIT/OFFSET子句或者是TOP或者是FETCH最后的结果截取。
限制结果集的数量为10。
这一步返回消费总额最高的前10个地区。
by中可以使用别名用on筛选和用where筛选有什么区别order
by之前执行了一次可以理解成在原有顺序的基础上的预加载也就是说对于mysql每一次运行代码实际上执行了至少两次select。
on和where的最大区别在于如果在on应用逻辑表达式那么在第三步join中还可以把移除的行再次添加回来而where的移除的最终的
的结构。
最后将这些结构连起来就是一个血缘图。
下图是完整SQL元数据结构部分模型
其主要的内容可以简单理解为将SQL语句解析为语法分析树,然后通过Toke序列转化为语法分析树,最终抽象语法树被传递给错误检查和语义分析阶段进行处理。
SQL语句:用户或应用程序提交一个或多个SQL语句给数据库执行。
SQL语句解析:数据库接收到SQL语句后,会对其进行词法和语法分析。
词法分析将SQL语句分解成一个个Token(如关键字、标识符、运算符等),语法分析则根据SQL语法规则验证这些Token序列是否构成一个有效的SQL语句
生成语法树:如果SQL语句通过了词法和语法检查,解析器会根据语句的结构生成一棵语法树。
语法树以树形结构表示SQL语句各个语法单元之间的关系,叶子节点对应SQL语句中的原子元素如表名、列名、值等,非叶节点则对应各种SQL子句如SELECT、FROM、WHERE等
语义分析:语法树生成后还需进行语义检查,如检查表和列是否存在,列之间的数据类型是否匹配等
连接器、查询缓存、解析器、预处理器、优化器、执行器内置函数日期、事件、数学、加密函数跨存储引擎的功能存储过程、触发器、视图
我们常说的索引数据结构就是由存储引擎层实现的不同的存储引擎支持的索引类型也不相同比如
且是默认使用也就是说在数据表中创建的主键索引和二级索引默认使用的是
如果一个用户已经建立了连接即使管理员中途修改了该用户的权限也不会影响已经存在连接的权限。
修改完成后只有再新建的连接才会使用新的权限设置。
给客户端。
如果查询的语句没有命中查询缓存中那么就要往下继续执行等执行完后查询的结果就会被存入查询缓存中。
查询语句的执行方案确定下来比如在表里面有多个索引的时候优化器会基于查询成本的考虑来决定选择使用哪个索引。
属于聚簇索引索引和数据一块储存InnoDB只有主键索引才能是聚簇索引
所谓的聚簇索引就是一个节点就是整个的一行数据。
我们平常见到的二叉树数据结构像这样
数据结构中只有左右指针和当前节点的值可以根据节点的值建立二叉搜索树。
代入到聚簇索引的定义中根据主键建立B树就像二叉搜索树左孩子val小于自己右孩子大于自己。
数据结构储存更多的东西把表中一行的所有内容都作为成员变量存起来。
找到了主键的节点也就找到了这一行的所有数据。
非聚簇索引则是使用索引项建立B树例如根据年龄、名字等节点里面则储存着对应行的主键。
比如我要查询年龄大于21岁的人并且年龄这一列拥有索引显然应该是非聚簇的因为年龄可能重复。
抽象地我们认为把年龄进行了排序我们仅能看到一群年龄从小到大而不知道这些人是谁。
我们把大于21岁人拉过来挨个撕开他们的面纱也就是他们的主键才知道是谁。
非聚簇索引只储存主键如果要查询那一行的其他信息则要根据主键再进行查询也就是用上面的那个聚簇索引找到了主键就找到了那一行的所有值。
这称为回表查询。
非聚簇索引不一定进行回表查询。
覆盖索引即需要查询的字段正好是索引的字段那么直接根据该索引就可以查到数据了
二级索引又称为辅助索引是因为二级索引的叶子节点存储的数据是主键。
也就是说通过二级索引可以定位主键的位置。
二级索引都是非聚簇索引。
表有主键索引id和普通索引name。
这条查询语句的结果既可以使用主键索引也可以使用普通索引但是执行的效率会不同。
这时就需要优化器来决定使用哪个索引了。
很显然这条查询语句是覆盖索引直接在二级索引就能查找到结果因为二级索引的
树的叶子节点的数据存储的是主键值就没必要在主键索引查找了因为查询主键索引的
1的第一条记录如果记录是不存在的就会向执行器上报记录找不到的错误然后查询结束。
如果记录是存在的就会将记录返回给执行器
执行器从存储引擎读到记录后接着判断记录是否符合查询条件其他查询条件这一步只是满足了主键的条件如果符合则发送给客户端如果不符合则跳过该记录。
存储引擎把一条记录取出后就将其返回给执行器Server层执行器继续判断条件不符合查询条件即跳过该记录否则发送到客户端
层每从存储引擎读到一条记录就会发送给客户端之所以客户端显示的时候是直接显示所有记录的是因为客户端是等查询语句查询完成后才会显示出所有的记录
推出的查询优化策略。
索引下推能够减少二级索引在查询时的回表操作提高查询的效率因为它将
层首先调用存储引擎的接口定位到满足查询条件的第一条二级索引记录也就是定位到
树快速定位到这条记录后获取主键值然后进行回表操作将完整的记录返回给
100000如果成立则将其发送给客户端否则跳过该记录接着继续向存储引擎索要下一条记录存储引擎在二级索引定位到记录后获取主键值然后回表操作将完整的记录返回给
可以看到没有索引下推的时候每查询到一条二级索引记录都要进行回表操作然后将记录返回给
层首先调用存储引擎的接口定位到满足查询条件的第一条二级索引记录也就是定位到
的第一条记录存储引擎定位到二级索引后先不执行回表操作而是先判断一下该索引中包含的列reward列的条件reward
100000是否成立。
如果条件不成立则直接跳过该二级索引。
如果成立则执行回表操作将完成记录返回给
层在判断其他的查询条件本次查询没有其他条件是否成立如果成立则将其发送给客户端否则跳过该记录然后向存储引擎索要下一条记录。
如此往复直到存储引擎把表中的所有记录读完。
列无法使用到联合索引但是因为它包含在联合索引agereward里所以直接在存储引擎过滤出满足
的记录后才去执行回表操作获取整个记录。
相比于没有使用索引下推节省了很多回表操作。
建立连接时连接器负责处理这些连接请求。
它验证客户端的身份和权限然后分配一个线程来处理该连接。
MySQL
每个连接线程会创建一个会话session在这个会话中客户端可以发送
①负责与客户端的通信,是半双工模式,这就意味着某一固定时刻只能由客户端向服务器请求或者服务器向客户端发送数据,而不能同时进行,其中mysql在与客户端连接TC/IP的②验证请求用户的账户和密码是否正确,如果账户和密码错误,会报错:Access
YES)③如果用户的账户和密码验证通过,会在mysql自带的权限表中查询当前用户的权限:
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback