基礎概念
派生表是從SELECT語句傳回的虛拟表。派生表類似于臨時表,但是在
SELECT
語句中使用派生表比臨時表簡單得多,因為它不需要建立臨時表的步驟。
術語:*派生表*和子查詢通常可互換使用。當
SELECT
語句的 FROM
子句中使用獨立子查詢時,我們将其稱為派生表。
以下說明了使用派生表的查詢:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnL4QzNyYDO2AjMtATN4kjM5IjNxkDMzADOxAjMtgzM1gTMx8CXzADOxAjMvwFOzUDOxEzLcd2bsJ2Lc12bj5ycn9Gbi52YugTMwIzcldWYtl2Lc9CX6MHc0RHaiojIsJye.png)
請注意,獨立子查詢是一個子查詢,可獨立于包含該語句的執行語句!與子查詢不同,派生表必須具有别名
執行個體中的例子
下面是一個派生表的例子
EXPLAIN SELECT
*
FROM
(
SELECT
companyid,
count(*)
FROM
system_company where CompanyId=1
) as a
limit 10
從EXPLAIN 這個執行計劃中可以發展,派生表沒有走索引
事實上,這個問題告訴我們,在資料量大的時候,不要使用派生表,那麼應該使用什麼呢?
下面請看子查詢的例子
EXPLAIN SELECT
(
SELECT
companyid
FROM
system_company
WHERE
CompanyId = a.companyid
LIMIT 1
) as field1
FROM system_company AS a
where companyid=1
通過查詢計劃可以看到,它是走索引的,所有執行效率自然快!
在我們進行分組統計時,也應該盡量使用子查詢,而不是派生表,看下面的例子,分别實作了對公司進行統計,将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
子查詢(索引聚合,值得推薦):
EXPLAIN SELECT
s.companyid,
(
SELECT
count(*)
FROM
system_companydetails
WHERE
companyid = s.companyid
) AS count
FROM
system_company s
where companyid=1
感謝各位的閱讀與分析!
有問題歡迎讨論!
作者:倉儲大叔,張占嶺,
榮譽:微軟MVP
QQ:853066980
支付寶掃一掃,為大叔打賞!