使用from中的子查詢來優化join


CREATE TABLE `fact` (ide

  `i` int(10) UNSIGNED NOT NULL,spa

  `val` int(10) UNSIGNED NOT NULL,orm

  KEY `i` (`i`,`val`)it

)class

 

CREATE TABLE `dim` (im

  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,查詢

  `pad` varchar(100) NOT NULL,di

  PRIMARY KEY  (`id`)view

)vi

a)SELECT count(*) FROM dim

30720

b)SELECT count(*) FROM fact

7340032

c)SELECT count(*) FROM fact WHERE i<10000

733444

d)SELECT count(*) FROM fact LEFT JOIN dim ON val=id WHERE i<10000

733444

如下查詢哪一個更快?

 

(1)SELECT i,pad FROM fact LEFT JOIN dim ON val=id WHERE i<10000 LIMIT 500000,10;

(2)SELECT i,pad FROM (SELECT i,val FROM fact WHERE i<10000 LIMIT 500000,10) res LEFT JOIN dim ON val=id;

 

第一個查詢:從fact表中獲得i<10000的行,再和dim進行鏈接;鏈接後,從第500000行起取10行(至關於最多7340032+733444*30720行要被掃描)

第二個查詢:從fact表中獲得i<10000的行,從第500000行起取10行;再和dim表進行鏈接(至關於最多7340032+10*30000行要被掃描)

 

顯然第二個查詢更快,那麼第二個查詢和第一個查詢的結果相等嗎?

因爲上述c和d查詢返回的行數相同,說明fact表中的每一行在dim表中都有相應的行與之對應,所以第二個查詢和第一個查詢是結果是相同的;所以,在上述狀況下,使用第二個查詢更快!

相關文章
相關標籤/搜索