MySQL对derived table的优化处理与使用限制

Mysql版本差异导致groupBy+orderBy结果不一致的问题 发现个问题。 mysql版本导致orderBy + groupBy之后的结果不一致 在mysql5.6版本和5.7版本稳定复线 举个栗子????: tests表中数据如下 想查找每个relate_id下created_at最大的数据 sql如下 select id,relate_id from (select id,relate_id from tests ORDER BY created_at desc) as t GROUP BY relate_id; 在5.6版本运行结果如下: 可以看出是能按 阅读详情

前言

随着MySQL版本的发展,优化器是越来越智能,优化器开关也越来越多,本文给大家分享一下MySQL对derived table的优化处理。

何为derived table?这里我把它翻译成派生表,简单来讲,就是将from 子句中出现的检索结果集当做一张表,比如from 一个select构造的子查询,这个子查询就是一个派生表,from 一个视图,这个视图就是一个派生表,from 一个with 构造的临时表(Common table expression,CTE),这个CTE表就是一个派生表。

一、优化器对derived table的优化

优化器处理derived table有两种策略:1.将derived table合并到外查询块中,2,将derived table 物化为一个临时表。使用优化器开关derived_merge来控制优化器选择哪种策略。设置为on,选择策略1;设置为off,选择策略2。此开关从5.7.6版本时引入,默认值为on。

8.0.22版本中又引入优化器开关derived_condition_pushdown,默认值为on,表示外查询块中与派生表相关的条件会推入到派生表中,设置为off,则不会推入。

下面实验来说明,接下来本章节实验都是基于MySQL8.0.25。

实验表结构

mysql> show create table t1\G
*************************** 1. row ***************************
       Table: t1
Create Table: CREATE TABLE `t1` (
  `id` int DEFAULT NULL,
  `c1` varchar(100) DEFAULT NULL,
  KEY `idx_id` (`id`),
  KEY `idx_c1` (`c1`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)

实验语句:

select * from (select id,c1 from t1 ) dt where id=2;

(1)当前为两个开关都打开,此为默认值

mysql> set optimizer_switch="derived_merge=on,derived_condition_pushdown=on";
Query OK, 0 rows affected (0.00 sec)

图片

从执行计划可以看出,select_type列没有DERIVED类型,说明派生表发生合并,相当于执行语句 select id,c1 from t1 where id=2合并后其实用不到下推了,下推关闭与否对执行计划没有影响。

(2)开启合并,关闭下推

![图片](data:image/svg+xml,%3C%3Fxml version='1.0' encoding='UTF-8'%3F%3E%3Csvg width='1px' height='1px' viewBox='0 0 1 1' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Ctitle%3E%3C/title%3E%3Cg stroke='none' stroke-width='1' fill='none' fill-rule='evenodd' fill-opacity='0'%3E%3Cg transform='translate(-249.000000, -126.000000)' fill='%23FFFFFF'%3E%3Crect x='249' y='126' width='1' height='1'%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)

可以看到对此语句而言,开启合并,不开启下推对执行计划没有影响。

(3)关闭合并,开启下推

mysql> set optimizer_switch="derived_merge=off,derived_condition_pushdown=on";
Query OK, 0 rows affected (0.00 sec)

![图片](data:image/svg+xml,%3C%3Fxml version='1.0' encoding='UTF-8'%3F%3E%3Csvg width='1px' height='1px' viewBox='0 0 1 1' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Ctitle%3E%3C/title%3E%3Cg stroke='none' stroke-width='1' fill='none' fill-rule='evenodd' fill-opacity='0'%3E%3Cg transform='translate(-249.000000, -126.000000)' fill='%23FFFFFF'%3E%3Crect x='249' y='126' width='1' height='1'%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)

select_type列出现DERIVED 类型, 说明派生表没有合并,派生表会物化为临时表,但此时外查询块中的条件推入到了派生表中,相当于执行语句 select * from (select id,c1 from t1 where id=2) dt,对过滤后的数据进行物化,先过滤再物化,访问的数据量小,物化结果集小。

(4)两个开关都关闭

mysql> set optimizer_switch="derived_merge=off,derived_condition_pushdown=off";
Query OK, 0 rows affected (0.00 sec)

图片

既不合并,又不下推,此时要对t1全表进行物化,再对物化结果集进行条件过滤。这种情况效率是最低的。

从上面的实验可以看出使用derived_merge, 可以避免不必要的物化,合并后,相当于将外查询块中的过滤条件直接推给了derived table。这样的执行计划更高效。那既然这样,下推的开关还有什么意义呢?

官方文档中有这样的说明:

When a derived table cannot be merged into the outer query (for example, if the derived table uses aggregation), pushing the outer WHERE condition down to the derived table should decrease the number of rows that need to be processed and thus speed up execution of the query.

也就是说合并有限制时,条件下推到派生表就起了作用,减少物化数据的行数,这样能加速查询的执行。

那我们接下来研究一下派生合并的限制吧

二、derived merge的使用限制。

derived merge有限制的时候,往往是derived_condition_pushdown发挥作用的时候,但是也有一些限制对这两者都有影响。

1.派生表中含有max(),min(),count(),sum()等聚合函数,或者含有DISTINCT,GROUP BY,HAVING这些分组子句, 此时不会发生合并,但是外层查询的条件会推入派生表。这一点是derived_condition_pushdown主要发挥作用的地方。

例子1:外层查询对派生表中的聚合列做过滤,过滤条件会以having子句的形式推入到derived table。

SELECT * FROM (SELECT i, j, SUM(k) AS sum FROM t1 GROUP BY i, j) AS dt WHERE sum > 100;

优化器会将语句改写为:

SELECT * FROM (SELECT i, j, SUM(k) AS sum FROM t1 GROUP BY i, j HAVING sum > 100) AS dt;

例子2:外层查询对派生表的分组列做过滤,过滤条件会直接 推入派生表,减少derived table物化结果集的大小。

SELECT * FROM (SELECT i,j, SUM(k) AS sum FROM t1 GROUP BY i,j) AS dt WHERE i > 10 

优化器会将语句改写为:

SELECT * FROM (SELECT i,j, SUM(k) AS sum FROM t1 WHERE i > 10 GROUP BY i,j) AS dt;

2.派生表的select 列表中有子查询,也就是标量子查询, 此时不会合并,但是条件会下推入派生表。

举例:

select *
   from (select stuno,
                course_no,
                (select course_name
                 from course c
                where c.course_no = a.course_no) as course_name,
                score
          from score a) b
       where b.stuno = 1;

![图片](data:image/svg+xml,%3C%3Fxml version='1.0' encoding='UTF-8'%3F%3E%3Csvg width='1px' height='1px' viewBox='0 0 1 1' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Ctitle%3E%3C/title%3E%3Cg stroke='none' stroke-width='1' fill='none' fill-rule='evenodd' fill-opacity='0'%3E%3Cg transform='translate(-249.000000, -126.000000)' fill='%23FFFFFF'%3E%3Crect x='249' y='126' width='1' height='1'%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)

上面这个例子中,因为派生表b的select 列表中有标量子查询 (select course_name from course c where c.course_no =a.course_no) as course_name,所以派生表 b 被物化,但是条件 stuno = 1 推入到派生表。

3.分配了用户变量,这种情况不发生合并,但是条件会下推入派生表。

select (@i := @i + 1) as rownum, stuno, course_no, course_name, score
       from ((select a.stuno, a.course_no, b.course_name, a.score
                from score a
                left join course b
                  on a.course_no = b.course_no) dt, (select (@i := 0) num) c)
      where stuno = 1;

图片

上面这个例子使用用户变量的形式给记录加了行号,不能合并,但是可以将条件下推到派生表。

4.如果合并会导致外查询块中超过61张基表的连接访问,优化器会选择物化派生表。

这个其实不用关注,几乎没有语句对表的访问达到这个量级。

5.UNION 或union all,这种情况不会发生合并,在MySQL8.0.29版本之后条件会下推。

select id, c1
  from (select id, c1 from t1 
        union 
        select id, c1 from t2) dt
 where dt.id = 1;

8.0.25版本:

![图片](data:image/svg+xml,%3C%3Fxml version='1.0' encoding='UTF-8'%3F%3E%3Csvg width='1px' height='1px' viewBox='0 0 1 1' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Ctitle%3E%3C/title%3E%3Cg stroke='none' stroke-width='1' fill='none' fill-rule='evenodd' fill-opacity='0'%3E%3Cg transform='translate(-249.000000, -126.000000)' fill='%23FFFFFF'%3E%3Crect x='249' y='126' width='1' height='1'%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)

8.0.32版本:

![图片](data:image/svg+xml,%3C%3Fxml version='1.0' encoding='UTF-8'%3F%3E%3Csvg width='1px' height='1px' viewBox='0 0 1 1' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Ctitle%3E%3C/title%3E%3Cg stroke='none' stroke-width='1' fill='none' fill-rule='evenodd' fill-opacity='0'%3E%3Cg transform='translate(-249.000000, -126.000000)' fill='%23FFFFFF'%3E%3Crect x='249' y='126' width='1' height='1'%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)

6.对于视图而言,创建视图时如果指定了ALGORITHM=TEMPTABLE,它会阻止合并,这个属性的优先级比优化器开关的优先级要高。

7.派生表中含LIMIT子句,这种情况既不会合并,也不会条件下推,因为合并或条件下推后会导致结果集改变。

select * from (select id,c1 from t1 limit 10) a where a. id=1;

8.只引用了字面量值,这种情况不发生合并。

select * from (select '1' as c1, 2 as c2 ) a;

对于前4种情况,合并被阻止,但是条件下推可以发挥作用,第5种union和union all的这种需使用8.0.29及之后的版本才会条件下推到派生表。6,7既不能合并也不能下推,对于8这种情况,没有想到实际的应用场景。

三、derived_condition_pushdown的使用限制

1.MySQL8.0.29版本以前,派生表中使用了union,条件不能推入派生表,MySQL8.0.29及以后的版本没有此限制,前面已提及。

2.派生表中使用了limit ,条件不能推入派生表,前面已提及。

3.条件包含子查询,不能推入到派生表,但是会发生合并

select stuno, course_no, course_name, score
  from (select a.stuno, a.course_no, b.course_name, a.score
           from score a
           left join course b
             on a.course_no = b.course_no) dt
 where stuno = (select distinct id from t1 where c1='gg张三')

图片

4.条件是一个带参数的表达式,无法推入派生表。

5.派生表作为外连接的内层表(比如left join的右表),条件无法推入到派生表,因为条件推入后,语句含义就变了。

6.从MySQL8.0.28版本开始,派生表的select 列表中包含分配的用户变量,条件不能推入派生表。

7.如果物化的派生表是一个Common Table Expression(CTE表),也就是使用with as构造的表,如果这个表被引用多次,则条件不能推入到派生表。

8.如果派生表是一个视图,视图创建时使用了ALGORITHM=TEMPTABLE,则条件不会推入进视图。

四、dervied_merge使用注意事项

如果满足以下三个条件,优化器会将derived table中的order by子句延迟到合并后的查询中执行。

  • (1)外层查询中没有分组或聚合运算
  • (2)外层查询没有指定distinct,having 或order by。
  • (3)外层查询中只有这个派生表作为from子句的唯一源。

这三个条件任何一项不满足,derived table中的order by子句将会被忽略。

举个例子:

--学生成绩表
create table score(stuno int,course_no varchar(10),score double(6,1),index idx_courseno(course_no),index idx_stuno(stuno));
 insert into score values(1,'yw',97),(1,'sx',100),(1,'yy',70);
 insert into score values(2,'yw',90),(2,'sx',90),(2,'yy',80);
 insert into score values(3,'yw',89),(3,'sx',99),(3,'yy',90);
 insert into score values(4,'yw',98),(4,'sx',88),(4,'yy',87);
 --科目表
 create table course(course_no varchar(10),course_name varchar(20),teacher varchar(20),note varchar(100),index idx_courseno(course_no));
 insert into course values('yw','语文','Jenny','aaa');
 insert into course values('sx','数学','Tony','bbb');
 insert into course values('yy','英语','Richard','ccc');

 --执行语句:查询学生语文学科的成绩,并按成绩倒序排列。
mysql>  select a.stuno, b.course_name, a.score, b.teacher
    ->    from (select stuno, course_no, score
    ->            from score
    ->           where course_no = 'yw'
    ->           order by score desc) a
    ->   inner join course b
    ->      on a.course_no = b.course_no;
+-------+-------------+-------+---------+
| stuno | course_name | score | teacher |
+-------+-------------+-------+---------+
|     1 | 语文        |  97.0 | Jenny   |
|     2 | 语文        |  90.0 | Jenny   |
|     3 | 语文        |  89.0 | Jenny   |
|     4 | 语文        |  98.0 | Jenny   |
+-------+-------------+-------+---------+
4 rows in set (0.00 sec)

虽然派生表中有对score列进行排序,但结果集中明显score列是乱序的,也就是order by 子句被忽略了。之所以被忽略,就是没有满足第三个条件,外层查询from子句中不只有派生表a,还有course表。

执行计划如下:执行计划中没有derived table 表a,说明发生了合并。

![图片](data:image/svg+xml,%3C%3Fxml version='1.0' encoding='UTF-8'%3F%3E%3Csvg width='1px' height='1px' viewBox='0 0 1 1' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Ctitle%3E%3C/title%3E%3Cg stroke='none' stroke-width='1' fill='none' fill-rule='evenodd' fill-opacity='0'%3E%3Cg transform='translate(-249.000000, -126.000000)' fill='%23FFFFFF'%3E%3Crect x='249' y='126' width='1' height='1'%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)

展示一下warning的信息。

mysql> show warnings;
+-------+------+--------------------------------------------------------------------------------------------
| Level | Code | Message                                                                                   |
+-------+------+-------------------------------------------------------------------------------------------+
| Note  | 1003 | /* select#1 */ select `test`.`score`.`stuno` AS `stuno`,`test`.`b`.`course_name` AS `course_name`,`test`.`score`.`score` AS `score`,`test`.`b`.`teacher` AS `teacher` from `test`.`score` join `test`.`course` `b` where ((`test`.`b`.`course_no` = 'yw') and (`test`.`score`.`course_no` = 'yw')) |
+-------+------+-------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

合并后相当于执行语句:

select a.stuno,b.course_name,a.score,b.teacher 
from score a,course b 
where a.course_no='yw' and b.course_no='yw';

如果禁止derived table合并,order by子句就不会被忽略,语句的结果就是正确的。

mysql> select /*+no_merge(a) */a.stuno, b.course_name, a.score, b.teacher
    ->    from (select stuno, course_no, score
    ->            from score
    ->           where course_no = 'yw'
    ->           order by score desc) a
    ->   inner join course b
    ->      on a.course_no = b.course_no;
+-------+-------------+-------+---------+
| stuno | course_name | score | teacher |
+-------+-------------+-------+---------+
|     4 | 语文        |  98.0 | Jenny   |
|     1 | 语文        |  97.0 | Jenny   |
|     2 | 语文        |  90.0 | Jenny   |
|     3 | 语文        |  89.0 | Jenny   |
+-------+-------------+-------+---------+
4 rows in set (0.00 sec)

五、控制优化器是否使用derived_merge与derived_condition_pushdown

抛开合并与条件下推的使用限制,MySQL提供了优化器开关与hint两种方式来灵活控制是否使用 derived_merge 与derived_condition_pushdown

1.优化器开关。

 set optimizer_switch="derived_merge=on" 启用派生表合并;

 set optimizer_switch="derived_merge=off"禁用派生表合并。

 set optimizer_switch="derived_condition_pushdown=on" 启用条件推入派生表;

 set optimizer_switch="derived_condition_pushdown=off" 禁用条件推入派生表;

2.hint。hint级别的控制优先级高于优化器开关。

/*+ MERGE(derived table name) */  启用派生表合并
/*+ NO_MERGE(derived table name) */ 禁用派生表合并
/*+ DERIVED_CONDITION_PUSHDOWN(derived table name) */  启用条件推入派生表
/*+ NO_DERIVED_CONDITION_PUSHDOWN(derived table name) */  禁用条件推入派生表

六、总结

本文参照官方文档的介绍,以及MySQL不同版本做了大量的实验测试,将derived table的优化处理以及使用限制、注意事项做了一个详细介绍,希望为SQL开发者及优化人员带来一丝帮助。

Enjoy GreatSQL :)

Enjoy GreatSQL :)

关于 GreatSQL

GreatSQL是由万里数据库维护的MySQL分支,专注于提升MGR可靠性及性能,支持InnoDB并行查询特性,是适用于金融级应用的MySQL分支版本。

相关链接: GreatSQL社区 Gitee GitHub Bilibili

GreatSQL社区:

image

社区有奖建议反馈: https://greatsql.cn/thread-54-1-1.html

社区博客有奖征稿详情: https://greatsql.cn/thread-100-1-1.html

社区2022年度勋章获奖名单: https://greatsql.cn/thread-184-1-1.html

(对文章有疑问或者有独到见解都可以去社区官网提出或分享哦~)

技术交流:

image-20221030163217640

mysql迁移之后读取速度变慢_记一次MySQL迁移并从MySQL5.6升级到5.7后查询慢了几十倍的问题... 起因因为生产环境数据量越来越大,客户越来越多,项目功能也越来越多,项目本身也越来越多,导致之前的服务器内存、硬盘都已经渐渐的不够用了,当时出现了2种解决方案,增加服务器配置和新购服务器,但是就算是新增硬盘,也需要对数据库进行迁移,所以就采用了新购服务器的方案,并且因为之前是高效云盘,出现过IO占满的情况,所以对于新购的服务器采用了SSD硬盘,理论上速度会飞起来了,实际上我在新服务器上安装MySQL... 阅读详情

相关推荐

MySQL派生表别名错误解析与实战解决方案

htmltable {th, td {th {pre {简介:在MySQL数据库操作中,“Every derived table must have its own alias”是因未为子查询(派生表)指定别名而引发的常见错误。派生表是SELECT语句中由子查询生成的临时表,仅在查询执行期间存在。本文详细解释该错误的成因,并通过实例展示如何正确添加别名以修复问题。

weixin_42163404的博客 1113

Mysql 查询优化器之派生条件回移Derived Condition Pushdown详解

Mysql 优化器之派生条件回移Derived Condition Pushdown详解 派生条件回移优化概述 Mysql 8.0.22之后的版本支持派生条件回移(Derived Condition Pushdown)优化。该优化可以减少派生表处理的行数从而提高查询执行的效率。比方说有如下查询: SELECT * FROM (SELECT i, j FROM t1) AS dt WHERE i >constant 通过派生条件回移优化后类似如下形式(WHERE条件拿到派生表的里面): .

数据科学汇集 1223

CTR模型:Deep&Cross Network

1. 简介 DCN模型(Deep & Cross Network for Ad Click Predictions)是2017年提出的。 出发点: (1)人工探索所有的交叉特征是不现实的; (2)难于推广未曾出现过的交叉特征。 DNN能够自动探索交叉特征并推广到未出现过的交叉特征,但是DNN的学习效率不高,且无法显式的学习特征交叉。 Deep&Cross Network, DCN 模型保留了DNN的优点,并提出了新的cross network,高效学习高阶特征交互。 优点: (1)cross

rosefun96的博客 9358

MySQL 8.0.32 DERIVED_CONDITION_PUSHDOWN 优化引起的BUG

MySQL 8.0.32 下使用含中文的字段作为模糊过滤条件,查找不到数据。

istruth::blog 603

告别零碎资料!手把手教你搞定ASTER L1T数据的预处理全流程(附ENVI实操)

本文详细介绍了ASTER L1T数据的预处理全流程,包括数据获取、质量检查、ENVI实操步骤(辐射定标、大气校正、几何精校正)以及热红外波段深度处理。特别适合地信领域初学者和研究人员,帮助快速掌握ASTER L1T数据处理技巧,提升定量反演研究效率。

weixin_30385925的博客 355

Lm317电压源芯片制作电流源

还在找电流源芯片么?如何使用电压源芯片快速搭建电流源。

Ekko的博客 1万+

Cannot convert string ‘\xE9\x87...‘ from utf8mb4 to binary

mysql模糊查询不到内容

moli_Y的博客 1342

全网首发--Unet3+改进16:在不同位置添加RepLKBlock超大卷积核

本文提出了一种基于大核卷积的神经网络架构RepLKNet,旨在缩小CNN与ViTs之间的性能差距。通过重新审视CNN中的大核设计,研究证明使用少量大卷积核替代多个小核能获得更强大的性能。提出的RepLKNet采用31×31大卷积核,在ImageNet和下游任务上取得了与SwinTransformer相当或更好的结果,同时具有更低延迟。文章详细介绍了实现步骤:(1)创建RepLKBlock模块文件;(2)在模型层中添加注意力机制;(3)在UNet模型中集成RepLKBlock;(4)完成训练流程。该方法展现了

AIcurator的博客 621

技术分享 | derived_condition_pushdown 影响外层 where 条件中用户自定义变量的使用

作者:姚嵩 爱可生南区交付服务部经理,爱好音乐,动漫,电影,游戏,人文,美食,旅游,还有其他。虽然都很菜,但毕竟是爱好。 本文来源:原创投稿 *爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。 摘抄: https://dev.mysql.com/doc/refman/8.0/en/derived-condition-pushdown-optimization.html 说明: MySQL 8.0.22开始,新增了 optimizer_switch 参数,新增了 derive.

ActionTech的博客 827

ubuntu linux虚拟机安装部署openclaw详细教程(安装、问题处理)

本文详细介绍了在Ubuntu系统下安装OpenClaw AI助手的完整流程及常见问题解决方案。主要内容包括:1) 通过GIT、Node.js等基础环境配置;2) 使用官方脚本或源码编译两种方式安装OpenClaw;3) 配置向导中的关键选项说明;4) 针对systemctl服务启动失败等常见错误的处理方法。文章特别强调了权限管理、网络依赖和访问配置等易错环节,提供了修改service文件等具体解决方案,帮助开发者顺利完成部署并实现Web UI访问。教程实操性强,适合本地和云服务器环境部署参考。

少说,多做 2032

2026年医疗AI的可信革命全栈实现(上)

医疗AI可信化:贝叶斯网络与向量数据库的协同架构 本文探讨2026年医疗AI发展的关键转折点——从追求生成能力转向构建可信决策系统。核心观点认为,医疗AI下一阶段的竞争焦点在于不确定性量化和错误传播约束,而非单纯的问答流畅度。研究提出以Python为开发语言、结合向量数据库与贝叶斯网络的混合架构: 技术分层 语言层(LLM):处理自然语言交互与工具调用 证据层(Milvus/Qdrant):实现可审计的临床知识检索 概率层(pgmpy/PyMC):执行贝叶斯推理与风险路由 治理层:确保权限控制与人工复核机制

AllenLV的博客 1151

MySQL 8.0 官方文档 第八章 优化(六)—— 引擎条件下推优化

目录第八章 优化(六)—— 引擎条件下推优化8.2 优化SQL语句8.2.1 优化 SELECT 语句8.2.1.5 引擎条件下推优化 第八章 优化(六)—— 引擎条件下推优化 8.2 优化SQL语句 8.2.1 优化 SELECT 语句 8.2.1.5 引擎条件下推优化 这种优化提高了在非索引列和常量之间进行直接比较的效率。在这种情况下,条件被“下推”到存储引擎上进行评估。此优化仅适用于NDB存储引擎。 对于 NDB 集群,这种优化可以避免在集群的数据节点和发出查询的MySQL服务器之间通过网络发送不匹配

HZ_Samuel博客 527

别再用Selenium被秒封了!2026最新反爬全突破+动态渲染实战(通过率99%)

做爬虫的同学,肯定都有过这样的经历:遇到一个纯前端渲染的网站,Requests抓包只能拿到一堆空的div标签,所有数据都是JS动态生成的。这时候你想到了Selenium,结果刚打开浏览器,网站直接跳出来一个"检测到机器人访问"的页面,或者直接返回403。我之前做一个跨境电商的爬虫项目,就踩了这个大坑。一开始用默认的Selenium ChromeDriver,10次请求有9次被封,通过率不到10%。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1385

MySQL一个关于derived table的bug描述与规避

*GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。关联文章:MySQL对derived table的优化处理与使用限制一、Bug描述同事遇到一个有意思的语句,说一条SQL在MySQL8.0.25版本运行出的结果明显与给定的where条件不符,而在8.0.26版本上是正常的,语句上加了一个无关的用户变量后在8.0.25版本上结果才是正确的,想不通这是怎么回事,这么有意思...

老叶茶馆 309

【错误解决】本地计算机上的mysql服务启动停止后,某些服务在未由其他服务或程序使用时将自动停止

转载请注明出处:http://blog.youkuaiyun.com/qq_26525215 本文源自【大学之旅_谙忆的博客】 在启动mysql服务时出现该错误: 本地计算机上的mysql服务启动停止后,某些服务在未由其他服务或程序使用时将自动停止。mysql 版本 5.7.14 系统 win 7后来经过一系列的百度,谷歌,总算是解决了。首先,你需要把原来的服务删除:mysqld --remove mysq

谙忆-陈浩翔 12万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

庖丁解牛|图解 MySQL 8.0 优化器查询转换篇

一 背景和架构 在《庖丁解牛-图解MySQL 8.0优化器查询解析篇》一文中我们重点介绍了MySQL最新版本8.0.25关于SQL基本元素表、列、函数、聚合、分组、排序等元素的解析、设置和转换过程,本篇我们继续来介绍更为复杂的子查询、分区表和JOIN的复杂转换过程,大纲如下: Transformation remove_redundant_subquery_clause :Permanently remove redundant parts from the query if 1) This is a

数据库技术 436

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

MySQL派生表合并优化的原理和实现

本文从一个案例出发梳理了MySQL派生表合并优化的流程实现和优化原理,并对优化前后同一条SQL语句在代码层面的类实例映射关系进行了对比。

华为云官方博客 1098

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

记一次MySQL迁移并从MySQL5.6升级到5.7后查询慢了几十倍的问题

起因 因为生产环境数据量越来越大,客户越来越多,项目功能也越来越多,项目本身也越来越多,导致之前的服务器内存、硬盘都已经渐渐的不够用了,当时出现了2种解决方案,增加服务器配置和新购服务器,但是就算是新增硬盘,也需要对数据库进行迁移,所以就采用了新购服务器的方案,并且因为之前用的是云盘,出现过IO占满的情况。所以对于新购的服务器采用了SSD硬盘,理论上速度会飞起来了,实际上我在新服务器上安装MySQ...

豆腐的魔法屋 1439

mysql关键字explain,优化查询效率

(参考)https://blog.youkuaiyun.com/hll814/article/details/50765232 https://blog.youkuaiyun.com/lr131425/article/details/61918741 explain关键字 如果在select语句前放上关键词explain,mysql将解释它如何处理select,提供有关表如何联接和联接的次序。 explain属性: id...

Prodigal 532

MySQL之视图:深度解析、性能优化与应用实践

大家好!在MySQL数据库的学习和实践中,视图作为一个重要的特性,在数据管理和查询优化方面有着独特的作用。一直以来,我都希望能和大家一起深入探索MySQL的各种技术,今天我们就来详细剖析视图的相关知识,包括它的实现方式、可更新视图的特点、对性能的影响以及实际应用中的注意事项,希望能帮助大家更好地掌握和运用视图,提升数据库开发和优化的能力。

wj_rdk的博客 1315

mysql 5.7 merge_记一次MySQL迁移并从MySQL5.6升级到5.7后查询慢了几十倍的问题

起因因为生产环境数据量越来越大,客户越来越多,项目功能也越来越多,项目本身也越来越多,导致之前的服务器内存、硬盘都已经渐渐的不够用了,当时出现了2种解决方案,增加服务器配置和新购服务器,但是就算是新增硬盘,也需要对数据库进行迁移,所以就采用了新购服务器的方案,并且因为之前是高效云盘,出现过IO占满的情况,所以对于新购的服务器采用了SSD硬盘,理论上速度会飞起来了,实际上我在新服务器上安装MySQL...

weixin_36330518的博客 399

【MySQL】基于MySQL的SQL优化(一)——从用explain关键字分析SQL语句开始

explain显示了MySQL如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。 如图:![这里写图片描述](http://img.blog.youkuaiyun.com/20161017212512939) 下面讲解explain的所有属性。 1)id:SELECT识别符。这是SELECT查询序列号。这个不重要,查询序号即为sql语句执行的顺序。

唐Ian的博客 3812

mysql 的EXPLAIN 使用详解

EXPLAIN 的使用详解 ID 列如果数据为一组数字,表示执行select语句的顺序,如果为NULL,说明这一行数据是有另外两个SQL语句进行UNION操作产生的结果集;ID值相同时,说明SQL执行顺序是按照显示的从上至下执行的,ID值不同时,ID值越大代表优先级越高,则优先被执行 select_type: select_type(值) 含义 SIMPLE 不包含子查询或是UNION操作查询 PRIMARY 查询中如果包含任何子查询,那么最外层的查询被标记为PRIMARY S

小十木的博客 254

MySQL_优化

MySQL优化就是通过合理安排资源,调整系统参数使MySQL运行更快更节省资源。所以,一方面要找出系统瓶颈,提高MySQL的整体性能,另一方面需要合理的结构设计和参数调整以提高用户操作的响应速度,同时,还应该尽可能节省系统资源,以便提供更大负荷的服务。 MySQL数据库优化是多方面的,原则是减少系统瓶颈,减少资源的占用,增加系统的反应速度。例如优化文件系统,提高磁盘IO速度,通过优化操作系统调度策...

Chill Lyn 2067

读书笔记52节--Optimizing Subqueries, Derived Tables, View References, and Common Table Expressions(2)

(指认为可做夫妻的男女)合意的,合适的,中意的;• For a query in which the condition is on the tables of a view created using ALGORITHM=TEMPTABLE instead of on the view itself, the multiple equality is not recognized at resolution【ˌrezəˈluːʃn 决议;(问题、分歧等的)解决,消除;(工作等的)分派,布置;

hongjian006的博客 1002
上一篇: MySQL Router高可用搭建
下一篇: GreatSQL删除分区慢的跟踪
GreatSQL社区
博客等级 码龄5年 1210粉丝 390原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值