數據庫~Mysql派生表注意的幾點~關於百萬數據的慢查詢問題


基礎概念

派生表是從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

感謝各位的閱讀與分析!

有問題歡迎討論!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM