SQL執行時間的迷因

問題:對於SQL(Structured Query Language)語法的使用已學習多年,但今天的偶然下解開了我多年執行困難,回想起來還是百思不解!!!


環境

(1).OSCentOS Linux release 7.8.2003 (Core) x86-64

(2).RDBMSmariadb Ver 15.1 Distrib 10.4.13-MariaDB, for Linux (x86_64)


步驟

(1).我要執行的SQL如下:

SELECT t.ppp, t.ddd, c.hhh, c.www, c.bbb FROM temp220404 AS t

LEFT JOIN casebycase AS c ON c.ppp = t.ppp AND c.ddd = t.ddd

ORDER BY t.ddd, t.ppp;

其實要下的語法不難,只是在二個table之間關聯某些欄位並撈取資料,況且二個table都有建立index("ppp"欄位)、pk=流水號。但是因為 temp220404 這個 table 資料有點大(約20萬筆)且寬(char_length200),所以每次執行都到天荒地老的出現錯誤回應: Error Code: 2013. Lost connection to MySQL server during query,同時 MariaDB 會當掉需要 restart...
因此,我將需要的欄位資料另存成一個 temporary table,再將其使用 LIMIT 來分批量執行...就要花費很多的時間來撈資料!!!

(2).今天突發奇想把上述的SQL改成如下:

SELECT t.ppp, t.ddd, c.hhh, c.www, c.bbb FROM temp220404 AS t

LEFT JOIN casebycase AS c ON c.ppp = t.ppp 

WHERE c.ddd = t.ddd

ORDER BY t.ddd, t.ppp;

結果,執行了 3.344 sec 就跑出結果了...感覺這幾年的時間被抽空,只能安慰自己能力不足要多學習!!!


感想:不知道SQL的精進是要執行很多次查詢呢?!還是要讀很多理論呢?!想一想,下手實作是必要的,或許徹底瞭解其中的數學原理或底層程式運作方式,才能真正地精進自己的功力!!!不多說,研究去~!


留言