基础概念

派生表是从SELECT语句返回的虚拟表。派生表类似于临时表,但是在​​SELECT​​语句中使用派生表比临时表简单得多,因为它不需要创建临时表的步骤。

术语:*派生表*和子查询通常可互换使用。当​​SELECT​​​语句的​​FROM​​子句中使用独立子查询时,我们将其称为派生表。

以下说明了使用派生表的查询:

数据库~Mysql派生表注意的几点~关于百万数据的慢查询问题_子查询

请注意,独立子查询是一个子查询,可独立于包含该语句的执行语句!与子查询不同,派生表必须具有别名

实例中的例子

下面是一个派生表的例子

EXPLAIN SELECT
*
FROM
(
SELECT
companyid,
count(*)
FROM
system_company where CompanyId=1
) as a
limit 10

从EXPLAIN 这个执行计划中可以发展,派生表没有走索引

数据库~Mysql派生表注意的几点~关于百万数据的慢查询问题_执行效率_02

事实上,这个问题告诉我们,在数据量大的时候,不要使用派生表,那么应该使用什么呢?

下面请看子查询的例子

EXPLAIN SELECT 
(
SELECT
companyid
FROM
system_company
WHERE
CompanyId = a.companyid
LIMIT 1
) as field1
FROM system_company AS a
where companyid=1

数据库~Mysql派生表注意的几点~关于百万数据的慢查询问题_执行效率_03

通过查询计划可以看到,它是走索引的,所有执行效率自然快!

在我们进行分组统计时,也应该尽量使用子查询,而不是派生表,看下面的例子,分别实现了对公司进行统计,将system_companydetails里的数量求和

派生表(全表扫描,效率低下):

EXPLAIN SELECT
s.companyid,a.count
FROM system_company s
inner join
(
SELECT
companyid,
count(*) as count
FROM
system_companydetails

) AS a on s.companyid=a.companyid
LIMIT 10

数据库~Mysql派生表注意的几点~关于百万数据的慢查询问题_子查询_04

子查询(索引聚合,值得推荐):

EXPLAIN SELECT
s.companyid,
(
SELECT
count(*)
FROM
system_companydetails
WHERE
companyid = s.companyid
) AS count
FROM
system_company s
where companyid=1

数据库~Mysql派生表注意的几点~关于百万数据的慢查询问题_子查询_05

感谢各位的阅读与分析!

有问题欢迎讨论!

 

作者:仓储大叔,张占岭,
荣誉:微软MVP