天天看點

資料庫~Mysql派生表注意的幾點~關于百萬資料的慢查詢問題

基礎概念

派生表是從SELECT語句傳回的虛拟表。派生表類似于臨時表,但是在

SELECT

語句中使用派生表比臨時表簡單得多,因為它不需要建立臨時表的步驟。

術語:*派生表*和子查詢通常可互換使用。當

SELECT

語句的

FROM

子句中使用獨立子查詢時,我們将其稱為派生表。

以下說明了使用派生表的查詢:

資料庫~Mysql派生表注意的幾點~關于百萬資料的慢查詢問題

請注意,獨立子查詢是一個子查詢,可獨立于包含該語句的執行語句!與子查詢不同,派生表必須具有别名

執行個體中的例子

下面是一個派生表的例子

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

從EXPLAIN 這個執行計劃中可以發展,派生表沒有走索引

資料庫~Mysql派生表注意的幾點~關于百萬資料的慢查詢問題

事實上,這個問題告訴我們,在資料量大的時候,不要使用派生表,那麼應該使用什麼呢?

下面請看子查詢的例子

EXPLAIN SELECT 
    (
        SELECT
            companyid
        FROM
            system_company
        WHERE
            CompanyId = a.companyid
        LIMIT 1
    ) as field1
FROM system_company  AS a
where companyid=1      
資料庫~Mysql派生表注意的幾點~關于百萬資料的慢查詢問題

通過查詢計劃可以看到,它是走索引的,所有執行效率自然快!

在我們進行分組統計時,也應該盡量使用子查詢,而不是派生表,看下面的例子,分别實作了對公司進行統計,将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派生表注意的幾點~關于百萬資料的慢查詢問題

子查詢(索引聚合,值得推薦):

EXPLAIN SELECT
    s.companyid,
    (
        SELECT
            count(*)
        FROM
            system_companydetails
        WHERE
            companyid = s.companyid
    ) AS count
FROM
    system_company s
where companyid=1      
資料庫~Mysql派生表注意的幾點~關于百萬資料的慢查詢問題

感謝各位的閱讀與分析!

有問題歡迎讨論!

作者:倉儲大叔,張占嶺,

榮譽:微軟MVP

QQ:853066980

支付寶掃一掃,為大叔打賞!

資料庫~Mysql派生表注意的幾點~關于百萬資料的慢查詢問題