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表中都有相應的行與之對應,所以第二個查詢和第一個查詢是結果是相同的;所以,在上述狀況下,使用第二個查詢更快!