数据库-子查询《mysql子查询的弱点》
2017-02-14 21:08
357 查看
mysql的子查询的优化不是很友好,一直有受业界批评比较多. 关于mysql的查询有两个知识点: 1.第一个为mysql在处理所有的查询的时候都强行转换为联接来执行,将每个查询包括多表中关联匹配,关联 子查询,union,甚至单表的的查询都处理为联接,接着mysql执行联接,把每个联接在处理为一个嵌套循环 (oracle-nest-loop); 2.在mysql在处理子查询的时候,会将将子查询改写,通常情况下,我们希望由内到外,先完成子查询的结果, 然后在用子查询来驱动外查询的表,完成查询。例如:Select * from test where test_id in (select fk_test_id from sub_test where group_id=10)通常我们会想到该sql的执行顺序为:
sub_test表中根据group_id取得fk_test_id(2,3,4,5,6),然后在到test中,带入test_id=2,3,4,5,6 取得查询数据,但是实际mysql的处理方式为:Select * from test where exists (select * from sub_test where group_id=10 and sub_test.test_id=test.id)。mysql将会扫描test中的所有数据, 每条数据将会传到子查询中与sub_test关联,子查询不能首先被执行,如果test表很大的话,那么性能上将会 出现问题; 这时候就需要改写查询了:select t1.* from test t1,(select fk_test_id from sub_test where group_id=10) t2 where t1.test_id=t2.fk_test_id ;
参考:http://hidba.org/?p=260
相关文章推荐
- mysql子查询 带 In 关键字的子查询 带比较运算符的子查询 带 Exists 关键字的子查询 带 Any 关键字的子查询 带 All 关键字的子查询
- MySQl心得4--4--数据库查询4--子查询
- mysql子查询的弱点
- 数据库多表查询____表连接,子查询
- MySQl心得4--4--数据库查询4--子查询
- MySQl心得4--4--数据库查询4--子查询
- 数据库——(10)联合查询和子查询
- 查询数据库中的第100条数据
- 如何查询其他数据库内的表(IN子句实例)?
- 数据库查询优化技术
- oracle表查询 数据库设计经验谈
- 数据库查询的外连接。
- 数据库的查询优化技术
- Asp.Net查询MSSQL数据库的一个例子
- 数据库的查询优化技术
- 数据库查询结果的动态排序
- 多层数据库开发九:查询数据库
- 无须进入Admin设置DSN直接连数据库进行查询
- 不刷新页面查询数据库中数据的方法--XML方法
- 使用ExecuteReader查询数据库