[英]MySQL Optimizing LEFT Join for Large Data Query with Same table
我在這里有一個表SQL
| id | dataid | datarow | datacolumn | datavalue
_________________________________________________
| 1 | 1 | 1 | FirstName | John
| 1 | 1 | 1 | LastName | Lobo
| 1 | 1 | 1 | Age | 35
| 1 | 1 | 2 | FirstName | Mich
| 1 | 1 | 2 | LastName | Handness
| 1 | 1 | 2 | Age | 22
| 1 | 1 | 3 | FirstName | Mike
| 1 | 1 | 3 | LastName | Longbow
| 1 | 1 | 3 | Age | 55
它將輸出類似這樣的內容
FirstName LastName Age
John Lobo 35
Mich Handness 22
Mike Longbow 55
SELECT DISTINCT
t1.datavalue AS Firstname,
t2.datavalue AS Lastname,
t3.datavalue AS Age
FROM largedatatable t1
LEFT JOIN (SELECT datavalue,datarow FROM largedatatable WHERE datacolumn='LastName') t2 ON t1.datarow = t2.datarow
LEFT JOIN (SELECT datavalue,datarow FROM largedatatable WHERE datacolumn='Age') t3 ON t1.datarow = t3.datarow
WHERE t1.dataid = 1
這給我的結果像
Firstname LastName Age
John Lobo 35
Mich Handness 22
Mike Longbow 55
現在,腳本可以正常運行了。 但是如果查詢的數據量很大,則查詢速度很慢。 無論如何,我仍然可以優化此SQL查詢。 謝謝!
我認為這可以解決您的問題,或者至少可以更快地運行,因為它將只提取一次表:
select
max(case datacolumn when 'FirstName' then datavalue else '' end) as FirstName,
max(case datacolumn when 'LastName' then datavalue else '' end) as LastName,
max(case datacolumn when 'Age' then datavalue else '' end) as Age
from
large
group by datarow
我會確保您在(datarow,datacolumn)上有一個索引來幫助您進行連接,但是您的連接可以簡化為
SELECT
t1.datavalue AS Firstname,
t2.datavalue AS Lastname,
t3.datavalue AS Age
FROM
largedatatable t1
LEFT JOIN largedatatable t2
on t1.datarow = t2.datarow
and t2.datacolumn = 'LastName'
LEFT JOIN largedatatable t3
on t1.datarow = t3.datarow
and t3.datacolumn = 'Age'
WHERE
t1.datacolumn = 'FirstName'
僅基於名字列,這將僅通過您的主表一次,但是不需要第二個實例的列,而無需聚合的MAX()或GROUP BY。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.