我不知道是否有人可以幫助我。 我有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
Wll,你有2 **快速**查詢。任何理由不使用它們? – zerkms 2011-02-04 03:58:41
你沒有考慮到`php`產生查詢2的時間。 – 2011-02-04 03:59:05