学会使用临时表优化,切记不要乱用临时表(记录一)
来源:互联网 发布:windows检查更新 编辑:程序博客网 时间:2024/06/14 14:02
今天检查满查询日志发现有个存储过程查询可以达17S
而且是订单列表查询,这个当然不能忍了,必须优化,接下来就是查找原因优化过程。过程使用动态语句,首先使用满查询的语句条件提取出来静态语句单独分析:
提取结果如下:
table1 表数据100W+ table3表数据200W+
SELECT b.*, A.value1, A.value2, A.value3, A.value4, A.value5, A.value6,FROM table1 b LEFT JOIN table2A ON b.order_no = A.order_no AND b.channel_no = A.channel_noWHERE 1 = 1 AND EXISTS (SELECT 1 FROM table3 t WHERE b.order_no = t.order_no AND t.ticket_no LIKE '%1792903240%')ORDER BY CREATE_TIME LIMIT 0, 20
为什么这个过程要10s+ 呢?
主要原因在于 exists这个部分,因为 table3有200W的数据,并且循环式和外表扫描查询,并且这里的like是不会走索引的,只能全扫描,所以慢就很明显了,由于是动态语句,并在存储过程中,所以优化就是拆解EXISTS这部分
主要思路就是 先从200W+ 的table3中查出来order_no 然后把order_no插入临时表,然后再使用in 临时表查询,减少关联扫描次数就能极大的优化查询时间
前提: table3中的ticket_no 重复率非常低,200W+的数据 有200W的非重复,为什么强调这个,临时表在处理少量数据时性能很优异,(一般只在确定不能用索引的时候才使用临时表,或者在存储过程中某些固定数据使用次数非常多的时候使用临时表,其他时候我一般不建议使用)
优化结果:
CREATE TEMPORARY TABLE tmp_order_no (ticket_order_no varchar(100));INSERT INTO tmp_order_no SELECT tp.order_no FROM t_passenger tp WHERE tp.ticket_no LIKE CONCAT('%',2903240,'%');SELECT b.*, A.value1, A.value2, A.value3, A.value4, A.value5, A.value6,FROM table1 b LEFT JOIN table2A ON b.order_no = A.order_no AND b.channel_no = A.channel_noWHERE 1 = 1 AND b.order_no IN (SELECT ticket_order_no FROM tmp_order_no)ORDER BY CREATE_TIME LIMIT 0, 20 DROP TEMPORARY TABLE IF EXISTS tmp_order_no;
优化后查询时间1.2S左右,速度提升十几倍,性能提升明显
阅读全文
0 0
- 学会使用临时表优化,切记不要乱用临时表(记录一)
- 优化临时表使用
- MYSQL,临时表优化一例
- mysql临时表优化
- 临时表空间优化
- 使用临时表优化大表查询
- 使用临时表进行性能优化
- 临时表的使用
- orale 临时表使用
- 使用临时表
- 临时表的使用
- 临时表使用
- 使用临时表
- Oracle临时表使用
- Oracle临时表使用
- 临时表的使用
- 使用临时表
- SQL 临时表 记录 未完
- 透明度与RGB
- Android 自定义相机黑屏
- Java类加载器概述
- Android Studio中进行单元测试和UI测试
- js的基本语法
- 学会使用临时表优化,切记不要乱用临时表(记录一)
- Fastjson内幕
- 如何禁用 Azure 虚拟机的日期时间同步
- js中数组的栈方法和队列方法
- hi3559av100 编译 Hi3559AV100ES_SDK_V2.0.2.0 软件包 遇到的问题
- Go 指针练手
- Uncaught SyntaxError: Unexpected identifier
- 奥威Power-BI电力行业BI解决方案-电流分析
- 自定义控件——加减器