基礎概念 派生表是從SELECT語句返回的虛擬表。派生表類似於臨時表,但是在SELECT語句中使用派生表比臨時表簡單得多,因為它不需要創建臨時表的步驟。 術語:*派生表*和子查詢通常可互換使用。當SELECT語句的FROM子句中使用獨立子查詢時,我們將其稱為派生表。 以下說明瞭使用派生表的查詢: 請 ...
基礎概念
派生表是從SELECT語句返回的虛擬表。派生表類似於臨時表,但是在SELECT
語句中使用派生表比臨時表簡單得多,因為它不需要創建臨時表的步驟。
術語:*派生表*和子查詢通常可互換使用。當SELECT
語句的FROM
子句中使用獨立子查詢時,我們將其稱為派生表。
以下說明瞭使用派生表的查詢:
請註意,獨立子查詢是一個子查詢,可獨立於包含該語句的執行語句!與子查詢不同,派生表必須具有別名
實例中的例子
下麵是一個派生表的例子
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
感謝各位的閱讀與分析!
有問題歡迎討論!