2011-02-04 41 views
2

我不知道是否有人可以幫助我。 我有2個查詢版本給我相同的結果。 一個使用2個查詢,但速度更快,另一個只使用一個查詢,但速度較慢。 我只是試圖找出是否有一個更好的方式在一個查詢中做到這一點,而不會減慢它。兩個mysql的查詢似乎比一個快,任何人都有任何想法如何將這些結合起來而不需要頭腦?

這一個足夠快....

query One: 
    SELECT * FROM global_rewrite_links 
    => do some php stuff (i used the IN Array numbers as example values) 
    Average q1 : 0.0015 sec 

query two, use php arrays in ON clause: 
    SELECT SQL_NO_CACHE master.prop_id,master.property_name FROM property_main master 
    INNER JOIN prop_normalize_options_sport_leisure_health jtbl0 ON (master.prop_id=jtbl0.prop_id AND jtbl0.item_id IN (37)) 
    INNER JOIN prop_normalize_options_property_activities jtbl1 ON (jtbl0.prop_id=jtbl1.prop_id AND jtbl1.item_id IN (17)) 
    INNER JOIN prop_normalize_options_property_suitability jtbl2 ON (jtbl1.prop_id=jtbl2.prop_id AND jtbl2.item_id IN (15)) 
    INNER JOIN prop_normalize_options_property_facilities_other jtbl3 ON (jtbl2.prop_id=jtbl3.prop_id AND jtbl3.item_id IN (57)) 
    WHERE master.active='Y' 
    GROUP BY master.prop_id 
    ORDER BY master.sortOrder 

Average q2 : ~0.06sec 

Total Average: ~0.07sec 

然而,作爲IN(「ARRAY」)被動態地從其他表中生成了(我tryying做這一切在同一個查詢),我結束了這一點,這是慢了很多:

SELECT SQL_NO_CACHE prop.prop_id,prop.property_name FROM property_main prop 
INNER JOIN prop_normalize_options_sport_leisure_health jTbl0 ON (prop.prop_id=jTbl0.prop_id AND jTbl0.item_id IN (SELECT item_id FROM global_rewrite_links WHERE link_1 IN ('pool') AND category_name_1='recreational-facilities')) 
INNER JOIN prop_normalize_options_property_activities jTbl1 ON (prop.prop_id=jTbl1.prop_id AND jTbl1.item_id IN (SELECT item_id FROM global_rewrite_links WHERE link_1 IN ('golf') AND category_name_1='activity-holidays')) 
INNER JOIN prop_normalize_options_property_suitability jTbl2 ON (prop.prop_id=jTbl2.prop_id AND jTbl2.item_id IN (SELECT item_id FROM global_rewrite_links WHERE link_1 IN ('non-smoking') AND category_name_1='accessibility')) 
INNER JOIN prop_normalize_options_property_facilities_other jTbl3 ON (prop.prop_id=jTbl3.prop_id AND jTbl3.item_id IN (SELECT item_id FROM global_rewrite_links WHERE link_1 IN ('internet') AND category_name_1='guest-facilities')) 
WHERE prop.active='Y' 
GROUP BY prop.prop_id 
ORDER BY prop.sortOrder 

Average: ~0.45sec 

我也嘗試了一些CASE/HAVING子句,但我想出了一個很嚴重。也許有人有更好的主意? 任何想法將非常感激

感謝

PS:創建

CREATE TABLE `global_rewrite_links` (
    `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, 
    `item_id` INT(20) UNSIGNED NULL DEFAULT NULL, 
    `parent_id` SMALLINT(5) UNSIGNED NULL DEFAULT NULL, 
    `sort` TINYINT(3) UNSIGNED NULL DEFAULT NULL, 
    `queryField` VARCHAR(200) NULL DEFAULT NULL, 
    `inFilter` ENUM('Y','N') NULL DEFAULT 'N', 
    `table_name` VARCHAR(200) NULL DEFAULT NULL, 
    `queryType` VARCHAR(3) NOT NULL DEFAULT 'AND', 
    `queryOperator` VARCHAR(2) NOT NULL DEFAULT '=', 
    `category_txt_1` VARCHAR(200) NULL DEFAULT NULL, 
    `category_txt_2` VARCHAR(200) NULL DEFAULT NULL, 
    `category_txt_3` VARCHAR(200) NULL DEFAULT NULL, 
    `category_name_1` VARCHAR(200) NULL DEFAULT NULL, 
    `category_name_2` VARCHAR(200) NULL DEFAULT NULL, 
    `category_name_3` VARCHAR(200) NULL DEFAULT NULL, 
    `link_txt_1` VARCHAR(200) NULL DEFAULT NULL, 
    `link_txt_2` VARCHAR(200) NULL DEFAULT NULL, 
    `link_txt_3` VARCHAR(200) NULL DEFAULT NULL, 
    `link_1` VARCHAR(200) NULL DEFAULT NULL, 
    `link_2` VARCHAR(200) NULL DEFAULT NULL, 
    `link_3` VARCHAR(200) NULL DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    INDEX `queryField` (`queryField`), 
    INDEX `inFilter` (`inFilter`), 
    INDEX `parentID` (`parent_id`), 
    INDEX `link1` (`link_1`, `category_name_1`, `item_id`), 
    INDEX `link2` (`link_2`, `category_name_2`, `item_id`), 
    INDEX `link3` (`link_3`, `category_name_3`, `item_id`) 
) 
COLLATE='latin1_swedish_ci' 
ENGINE=MyISAM 
ROW_FORMAT=DEFAULT 
AUTO_INCREMENT=285 
+0

Wll,你有2 **快速**查詢。任何理由不使用它們? – zerkms 2011-02-04 03:58:41

+0

你沒有考慮到`php`產生查詢2的時間。 – 2011-02-04 03:59:05

回答

2

老實說,我認爲這是一個非問題。行業似乎有一些癡迷,認爲更少的查詢比更好。從一般意義上說,這是事實,因爲2個查詢與1,000,000相同的查詢會更好。但是在具體的情況下,它可能會或可能沒有意義。我寧願有10個主鍵查詢查詢(SELECT foo FROM bar WHERE id = 1),而不是1個笛卡爾連接。在邏輯意義上合併查詢這樣做效率很高。否則,不要擔心。

在您的具體情況下,您可能可以創建一個查詢,如果不比兩個查詢快,則查詢速度一樣快。但我必須問,這是否值得?您執行時間的85%在執行第二個查詢。所以除非你提高效率,否則你可以獲得的最大收益是15%。雖然這很好,但仍然只有0.01秒。你願意爲此付出多少工作?我的觀點是沒關係,所以不要擔心。相反,請關注您可以在其他地方獲得的較大收益,或者先讓第二個查詢更高效。

至少,這是我的$ 0.02 ...

相關問題