mysqlcount派⽣表_MySQL派⽣表优化
派⽣表(Derived Table),是复杂SQL在执⾏过程中的中间表,也可认为是临时表,存放SQL执⾏过程中必不可少的中间数据。通常由跟在from⼦句或者join⼦句之后的⼦查询产⽣,⽐如下⾯两个派⽣表例⼦,derived_t1和derived_t2都是派⽣表。
lect * from (lect * from t1) as derived_t1;手机号查物流
李群玉lect t1.* from t1 join (lect distinct class_id from t2) as derived_t2 where t1.id=derived_t2.class_id;
蚯蚓养殖技术
2. MySQL优化器如何处理派⽣表?
MySQL优化器处理派⽣表有两种策略:
高热量食物将派⽣⽣合并(Merging)到外部的查询块
物化(Materialize)派⽣表到内部的临时表
2.1 合并(Merging )
对于简单的派⽣表,⽐如没有使⽤group by,having,distinct,limit等,这类派⽣表可直接合并到外部
的查询块中。如下⾯两个例⼦:
例⼦1:
SELECT * FROM (SELECT * FROM t1) AS derived_t1;
合并后变成:
SELECT * FROM t1;
色弱能考驾照吗
例⼦2:
SELECT * FROM t1 JOIN (SELECT t2.f1 FROM t2) AS derived_t2 ON t1.f2=derived_t2.f1 WHERE t1.f1 > 0;
合并后变成:
SELECT t1.* FROM t1 JOIN t2 ON t1.f2=t2.f1 WHERE t1.f1 > 0;
2.2 物化(Materialization)
所谓物化,可以理解为在内存中⽣成⼀张临时表,将派⽣表实例化,物化派⽣表成本较⾼,尤其当派⽣表很⼤,内存不够⽤时,物化的派⽣表还要转存到磁盘中,对性能影响进⼀步增加。
2.3 优化器对派⽣表做的优化
对于简单的派⽣表,进⾏合并处理。派⽣表合并也有限制,当外层查询块涉及的表数量超过⼀定阈值(61)时,优化器将选择物化派⽣表,⽽不是合并派⽣表。
MySQL优化器在处理派⽣表时,能合并的先合并,不能合并的,考虑物化派⽣表,然⽽物化派⽣表也是有成本的,优化器也会尽量推迟派⽣表的物化,甚⾄不物化派⽣表。⽐如join的两个表,A为派⽣表,另外⼀个表为B,优化器推迟派⽣表A的物化,先处理表B,当表B中的数据根据条件过滤后,数据很少,或者完全没有数据时,此时物化派⽣表A成本就会低很多,甚⾄不⽤物化派⽣表。
查询条件从外层查询下推到派⽣表中,以便⽣成更⼩的派⽣表,越⼩的派⽣表,其性能越好。
优化器将会对物化的派⽣表增加索引,以加速访问。⽐如下⾯这个例⼦,优化器将会对derived_t2的f1字段添加索引,以提⾼查询性能。
SELECT * FROM t1 JOIN (SELECT DISTINCT f1 FROM t2) AS derived_t2 ON t1.f1=derived_t2.f1;子宫肌瘤的治疗
3. 派⽣表合并开关
派⽣表合并,通过参数optimizer_switch来控制是否打开,默认为打开。
optimizer_switch=’derived_merge=ON’;
周杰伦好听的歌4. 派⽣表合并限制
小便痛怎么办不是所有的派⽣表都可以被merge,简单的派⽣表,可以被merge,复杂的带有GROUP,HAVING,DISTINCT,LIMIT,聚集函数等⼦句的派⽣表只能被物化,不能被合并。