2011-11-02 42 views
0

除了簡單的插入和選擇之外,MySQL查詢還不夠新,所以如果這看起來很基本,我會提前致歉。3表加入 - 優化建議?

我有一個數據庫與幾個多對多的關係,並試圖建立一個JOIN查詢跨3個表。這是我試圖寫的第一個大表/大查詢,所以我會閱讀我讀過的教程。查詢返回所有正確的值,但是,似乎運行得相當慢(本地主機上的平均值爲0.25秒,但在峯值點左右達到.7)。

我想知道如果任何人有任何建議如何使其更有效?我玩過索引(對這些人來說也是新的),似乎沒有什麼可衡量的效果 - 這裏的實時殺手似乎是ORDER BY語句。不幸的是,儘管拖網堆棧溢出並嘗試了大量東西,但我無法繞過這些優化。

這是備受關注的查詢:

SELECT a.d_id, cs_id, blg_id, d_name, d_slug, ct_id, a.cc_id 
FROM collection a 
JOIN designers b 
ON a.d_id = b.d_id 
JOIN designer2type c 
ON a.cc_id = c.cc_id 
WHERE cs_id = '3' 
ORDER BY d_name, ct_id ASC 

我已經嘗試了一些替代品(複製子上查詢一些教程,花了更長的時間來運行,也其下面有一個類似的平均水平,但更更高最大:

SELECT collection.d_id, cs_id, blg_id, d_name, d_slug, collection.cc_id, c_url FROM collection, designers, c_image WHERE cs_id = '3' AND c_image.ci_id = collection.ci_id AND collection.d_id = designers.d_id ORDER BY d_name ASC 

這是解釋與||代表分欄符:

id || select_type || table || type || possible_keys || key || key_len || ref || rows || Extra 
1 || SIMPLE || a || ref || PRIMARY,d_id,cs_id || cs_id || 4 || const || 8403 || Using temporary; Using filesort 
1 || SIMPLE || b || eq_ref || PRIMARY || PRIMARY || 4 || test.a.d_id || 1  
1 || SIMPLE || c || ref || cc_id || cc_id || 4 || test.a.cc_id || 1 

而這些表的結構:

CREATE TABLE `collection` (
`cc_id` int(8) NOT NULL AUTO_INCREMENT, 
`d_id` int(4) NOT NULL, 
`cs_id` int(3) NOT NULL, 
`cfw_id` int(2) NOT NULL, 
`c_id` int(8) NOT NULL, 
`ci_id` int(8) NOT NULL, 
`cg_id` int(1) NOT NULL, 
`blg_id` bigint(20) NOT NULL, 
PRIMARY KEY (`cc_id`), 
KEY `d_id` (`d_id`), 
KEY `cs_id` (`cs_id`), 
KEY `cfw_id` (`cfw_id`), 
KEY `c_id` (`c_id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

CREATE TABLE `designers` (
`d_id` int(4) NOT NULL AUTO_INCREMENT, 
`d_name` varchar(100) NOT NULL, 
`d_slug` varchar(100) NOT NULL, 
PRIMARY KEY (`d_id`), 
KEY `d_name` (`d_name`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=52782 ; 

CREATE TABLE `c_designer2type` (
`cd2t_id` int(8) NOT NULL AUTO_INCREMENT, 
`cc_id` int(8) NOT NULL, 
`ct_id` int(2) NOT NULL, 
`cd2t_desc` text NOT NULL, 
PRIMARY KEY (`cd2t_id`), 
KEY `cc_id` (`cc_id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=57545 ; 

我不知道這是否是一個查詢問題,索引問題,或表結構問題。或者根本不是什麼問題,儘管在本地主機上接近一秒鐘,沒有其他負載,只有中等數量的行在我的腦海中似乎很高。無論哪種方式,沒有關於這個項目正在使用,所以如果需要可以改變任何東西。

如果任何人對上,我可能在其中將不勝感激:)

感謝的追求是想錯了任何想法/建議,塔尼亞

回答

0

嘗試「cc_id」添加索引c_designer2type表,當前查詢必須多次掃描整個表才能進行連接。

此外,它可能值得考慮一個關於「cs_id」的索引,因爲這是您的主要選擇標準,在當前設置'collection'表中的每一行都會檢查它是否匹配。如果'cs_id'有合理數量的值,這是值得的。如果你只有1,2 & 3其實不值得。