2012-06-06 168 views
0

我有2個表t1 - > t2(共同的一對多關係)與表上的140.000記錄t2在t1重新審查50.000記錄,forese關鍵有時是空(沒有父母)。MySQL加入緩慢查詢

CREATE TABLE `t1` (
`id` int(11) NOT NULL AUTO_INCREMENT, 
`name` varchar(50) NOT NULL, 
PRIMARY KEY (`id`), 
KEY `name_idx` (`name`) 
) ENGINE=InnoDB AUTO_INCREMENT=125666 DEFAULT CHARSET=utf8 

CREATE TABLE `t2` (
`id` int(11) NOT NULL AUTO_INCREMENT, 
`name` varchar(50) NOT NULL, 
`t1_id` int(11) DEFAULT NULL, 
PRIMARY KEY (`id`), 
KEY `t1_id_idx` (`t1_id`) 
CONSTRAINT `t1_fk` FOREIGN KEY (`t1_id`) REFERENCES `t1` (`id`), 
) ENGINE=InnoDB AUTO_INCREMENT=125666 DEFAULT CHARSET=utf8 

此查詢運行15秒時:

SELECT * FROM t2 
LEFT JOIN t1 ON t2.t1_id = t1.id 
ORDER BY t1.name ASC 
LIMIT 10; 

此查詢0.5秒開跑:

SELECT * FROM t2 
LEFT JOIN t1 ON t2.t1_id = t1.id 
WHERE t1.name <> 'any not found value' 
ORDER BY t1.name ASC 
LIMIT 10; 

任何機構可以給我爲什麼發生這種情況解釋一下嗎?

觀察:編輯。

新聞:

此查詢上0.06秒運行:(什麼是CHANGE內加入!!)

SELECT * FROM t2 
INNER JOIN t1 ON t2.t1_id = t1.id 
ORDER BY t1.name ASC 
LIMIT 10; 

但上面查詢不就是我的一個解決方案,在我情況t2.t1_id可以爲空一些時間。

任何想法??

新聞:

運行解釋有左,內部聯接:

Mysql的顯示:使用臨時;使用文件排序;行:140.000

有內加入:

Mysql的顯示:使用Where;行數:8

+0

這些表有多少條記錄?是否有適當的索引定義 – Shyju

+0

@Shyju,第一句話說't2'有140K記錄和't1'有50K。 –

回答

2

解決了!

的問題是爲了用,使用時順序由MySQL創建temporaty文件(解釋...... 使用臨時),這個臨時文件過大造成的滯後。

提示:

  • 避免使用Tempoaray
  • 使用臨時不加載大量數據時。
0

我懷疑你已經有一個t1.name的索引,但它是降序而不是升序。這就解釋了爲什麼第二次查詢是如此之快。

另一種解釋是第一個查詢沒有被緩存,但第二個查詢發現緩存中的數據運行得更快。

+0

我更改了創建表sql以適應實際表。 t1.name具有索引。我將在兩個查詢上運行解釋...等待! – JoeLoco