update优化一条。

原语句

update HAHA a set (td03_flag) = (select td03_flag

from z_temp1 b where a.user_id = b.user_id and lx = 'pz')


Plan hash value: 1855602026

SQL_ID  62h7a9s7yyr18, child number 0
-------------------------------------
 update HAHA a set (td03_flag) = (select td03_flag
from z_temp1 b where a.user_id = b.user_id and lx = 'pz')

Plan hash value: 1855602026

-------------------------------------------------------------------------------------------------------------
| Id  | Operation                         | Name                    | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------------------------
|   0 | UPDATE STATEMENT                  |                         |       |       |  8720M(100)|          |
|   1 |  UPDATE                           | HAHA 	            |       |       |            |          |
|   2 |   TABLE ACCESS FULL               | HAHA         	    |  2094K|    51M|  5404   (3)| 00:01:05 |
|   3 |   TABLE ACCESS BY INDEX ROWID     | Z_TEMP1                 | 24383 |   714K|  4163   (2)| 00:00:50 |
|   4 |    BITMAP CONVERSION TO ROWIDS    |                         |       |       |            |          |
|   5 |     BITMAP AND                    |                         |       |       |            |          |
|   6 |      BITMAP CONVERSION FROM ROWIDS|                         |       |       |            |          |
|*  7 |       INDEX RANGE SCAN            | Z_TEMP1_U               |  2438K|       |     3   (0)| 00:00:01 |
|   8 |      BITMAP CONVERSION FROM ROWIDS|                         |       |       |            |          |
|*  9 |       INDEX RANGE SCAN            | Z_TEMP1_L               |  2438K|       |  4108   (2)| 00:00:50 |
-------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------

   7 - access("B"."USER_ID"=:B1)
   9 - access("LX"='pz')


我们可以看第7步的谓词7 - access("B"."USER_ID"=:B1)    这种:B1 是一个变量,变量就有输入源,这里的变量的输入源就是第2步中的每一行

我们就可以简单理解为,就是第2步有多少条语句,第三步就要执行多少次(7是第三步的子步骤,从这一步开始,一直执行完整个 第3步)   这种行为即是Nested loop。


虽然这里有索引,但这里的整个过程,是 两个位图索引 bitmap and,并且会回表,都是单块读,其中回表的单块读在这里占大头(每次都有24383个单块读)的。 我们从统计信息看到 步骤2 有2094K 行 
我们可以简单认为, 第三步 这个整个步骤(bitmap and +回表) 被整个执行了 2094K即200多万次。   不慢才怪 


优化后语句

explain plan for merge into HAHA a
using (select  td03_flag, user_id
         from z_temp1 b
        where user_id in (select  user_id 
                              from HAHA where lx='pz')
       ) h
on (a.user_id = h.user_id)
when matched then
  update set a.td03_flag = h.td03_flag;


这里需要创建两个索引

create index HAHA_IDX on HAHA(lx,user_id) ;
create index z_temp1_ind_uidtd03 on z_temp1(userid,td03_flag) ;


优化前SQL2个小时还没跑完

之后虽然执行时间对方没有反馈,但对方也没有再喊叫  看来满足需求了:)


优化虽易,乙方不易,且行且珍惜


<think>好的,用户想了解如何优化慢查询SQL的方法。首先,我需要回忆一下之前学习过的相关知识,并结合提供的引用内容来组织回答。 首先,用户提到的引用[1]中提到了定位慢查询SQL的方法,比如使用慢日志和explain工具。引用[2]则强调了避免使用select *,因为这会导致回表操作,影响性能。所以,优化慢查询需要从定位和分析开始,然后再具体优化。 接下来,我应该按照用户的要求,结构清晰地分步骤回答。步骤可能包括定位慢查询、分析执行计划、具体优化技巧等。每个步骤里需要详细说明方法,比如慢日志如何开启,explain各字段的含义,索引的优化策略等。 然后,要注意用户提到的格式要求,比如数学表达式用$...$,独立公式用$$...$$,但这个问题可能涉及的不多,但如果有涉及性能分析的公式可能需要使用。例如,提到索引的查询复杂度是O(log n)之类的,但可能暂时不需要,先专注于步骤和技巧。 还需要生成相关问题,这部分需要根据回答内容提出相关的问题,比如如何解读执行计划,索引设计原则,分页查询优化等。确保问题与回答内容紧密相关,帮助用户进一步学习。 需要检查是否遗漏了重要点,比如覆盖索引、避免隐式转换、分库分表等。同时,确保每个优化技巧都有对应的解释,比如为什么减少回表能提升性能,或者为什么JOIN字段要索引。 最后,确保回答符合中文要求,引用标识正确添加,例如在提到慢日志和explain时引用[^1],提到select *时引用[^2]。还要注意代码块的格式是否正确,比如SQL语句用代码块包裹。 总结下来,回答的结构应该是: 1. 定位慢查询:开启慢日志,监控工具 2. 分析执行计划:explain各字段意义 3. 优化技巧:索引优化、避免select *、分页优化等 4. 其他注意事项:数据库结构优化、硬件升级等 5. 相关问题:生成三个相关问题 现在需要将这些内容用清晰的中文表达出来,确保每个步骤有逻辑性,并且引用正确。</think>### 如何优化慢查询 SQL #### 1. **定位慢查询** - **开启慢查询日志** 在数据库配置中设置`slow_query_log=1`,并定义执行时间的阈值(如`long_query_time=2`秒),记录执行时间超过阈值的SQL语句[^1]。 - **使用监控工具** 通过数据库自带的性能分析工具(如MySQL的`SHOW PROCESSLIST`)或第三方APM工具,实时监控高耗时SQL。 #### 2. **分析执行计划** - **使用`EXPLAIN`命令** 在SQL语句前添加`EXPLAIN`,分析查询的执行计划,重点关注以下字段: - `type`:查询类型(如`ALL`表示全表扫描,需优化)。 - `key`:实际使用的索引。 - `rows`:预估扫描行数(值越大性能越低)。 - `Extra`:额外信息(如`Using filesort`表示需优化排序)。 #### 3. **优化技巧与方案** - **索引优化** - 为WHERE、JOIN、ORDER BY涉及的字段添加索引,例如: ```sql CREATE INDEX idx_user ON user(name, age); ``` - 避免索引失效的情况,如: - 对索引字段进行函数操作(`WHERE YEAR(create_time) = 2023`)。 - 隐式类型转换(如字段为字符串类型时使用`WHERE id = 100`)。 - **减少回表操作** 使用覆盖索引(索引包含查询所需字段),避免`SELECT *`。例如: ```sql SELECT name, age FROM user WHERE name = 'John'; -- 若(name,age)是联合索引,则无需回表 ``` - **分页查询优化** 避免`LIMIT 100000, 10`式深分页,改用基于游标的分页(如`WHERE id > 100000 LIMIT 10`)。 - **分解复杂查询** 将多表JOIN拆分为多个单表查询,利用程序逻辑整合结果,降低锁竞争和资源消耗。 #### 4. **其他注意事项** - 避免全表更新的语句(如`UPDATE table SET col = value`)。 - 定期优化表结构,删除冗余字段,拆分大表。 - 若数据量过大,考虑分库分表或读写分离。 #### 5. **验证与调优** - 优化后重新执行`EXPLAIN`,确认索引生效。 - 对比优化前后的执行时间(可通过`EXPLAIN ANALYZE`获取实际执行数据)。 ---
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值