MySQL子查询的优化
程序员文章站
2024-04-04 12:04:47
...
一、MySQL子查询的位置当一个查询是另一个查询的子部分是,称之为子查询(查询语句中嵌套含有查询语句)。子查询也是使用频率比较高的一种查询类型。因此,优化
一、MySQL子查询的位置当一个查询是另一个查询的子部分是,,称之为子查询(查询语句中嵌套含有查询语句)。子查询也是使用频率比较高的一种查询类型。因此,优化子查询,对于整个系统的性能也有直接的影响。
从查询出现在SQL语句的位置来看,它可以出现在目标列中,也可以出现在from子句中,还可以出现在JOIN/ON子句、GROUPBY子句、HAVING子句、ORDERBY子句等位置。下面依次来看这几种形式的子查询,以及对他们进行优化的一些想法。
1、子查询出现在目标列位置
当子查询出现在目标列位置的时候,这种查询只能是标量子查询。也就是说子查询返回的结果只能是一个元组的一个属性。否则,数据库会返回错误信息。
下面为了实验上面这段话,我们来新建一些表,并插入一些数据。
create table t1 (k1 int primary key, c1 int); create table t2 (k2 int primary key, c2 int); insert into t2 values (1, 10), (2, 2), (3,30);SQL语句的结果为:
mysql> select t1.c1, (select t2.c2 from t2) from t1, t2; Empty set (0.00sec)t1表中插入一些数据:
mysql> insert into t1 values (1, 1), (2, 2), (3, 3); Query OK, 3 rows affected (0.00 sec)a中的查询,我们可以看到执行的结果
mysql>select t1.c1, (select t2.c2 from t2) from t1, t2; ERROR 1242(21000): Subquery returns more than 1 rowt2表,然后再执行a中所做的查询。
mysql>delete from t2; QueryOK, 3 rows affected (0.00 sec) mysql> select t1.c1, (select t2.c2 from t2) from t1, t2; Empty set (0.00 sec)t2表中删除的数据在插入到t2表:
mysql>insert into t2 values (1, 10), (2, 2), (3, 30); Query OK,3 rows affected (0.00 sec)然后执行如下查询:
mysql> select t1.c1, (select t2.c2 from t2 where k2=1) from t1, t2; +------+-----------------------------------+ | c1 | (select t2.c2 from t2 where k2=1) | +------+-----------------------------------+ | 1 | 10 | | 2 | 10 | | 3 | 10 | | 1 | 10 | | 2 | 10 | | 3 | 10 | | 1 | 10 | | 2 | 10 | | 3 | 10 | +------+-----------------------------------+我们可以清楚的看到MySQL为我们返回的结果。
f、我们对e中的查询再换一种写法,可以看到返回的结果为
mysql> select t1.c1, (selectt2.c2 from t2 where c2 > 1) from t1, t2; ERROR 1242 (21000): Subqueryreturns more than 1 row