1、什么是子查询、表关联查询:
子查询:是指在主sql语句中的select或where子句中使用select查询语句;select a.name,(select b.name from b where b.id=a.id) from a where a.name lik 'a%'
表关联查询:指多个表联合查询。select a.name,b.name from a,b where a.id=b.id and a.name like 'a%';
尽管联合查询性能并不佳。可是和 MySQL 的子查询比起来还是有非常大的性能优势。
子查询:是指在主sql语句中的select或where子句中使用select查询语句;select a.name,(select b.name from b where b.id=a.id) from a where a.name lik 'a%'
表关联查询:指多个表联合查询。select a.name,b.name from a,b where a.id=b.id and a.name like 'a%';
尽管联合查询性能并不佳。可是和 MySQL 的子查询比起来还是有非常大的性能优势。
MySQL 的子查询运行计划一直存在较大的问题。尽管这个问题已经存在多年。可是到眼下已经公布的全部稳定版本号中都普遍存在,一直没有太大改善。
尽管官方也在非常早就承认这一问题。而且承诺尽快解决。可是至少到眼下为止我们还没有看到哪一个版本号较好的攻克了这一问题。
默认情况,子查询中使用全表扫描,所以总的I/O次数=主表数*子表数。
当主表、子表中数据均查过1w时,使用子查询的总体性能就会马上下降。并且下降的会非常厉害(測试发现大概须要10s多)
针对上面问题,解决方式:
1)对子表中的关联列建立索引、或建立外键关系:
例如以下有两张表a、b。使用子查询其运行计划例如以下
a表结构: