2017-04-13 64 views
0

有沒有辦法加快這件事?以恆定列表值加速查詢

SELECT LOWER(nameid), COUNT(nameid) AS cant 
FROM infos AS i 
WHERE i.value > 0 
AND i.oid IN ($1) 
AND i.nameid IN ($2) 
GROUP BY nameid 

$ 1 是一個長期的逗號分隔列表一樣的ID 1,2,3,4,5,6,7等。

$ 2 就好比是 「ABC」, 「DEF」, 「GHI」 逗號分隔字符串列表等

CREATE TABLE `infos` (
    `id` int(11) NOT NULL, 
    `oid ` int(11) NOT NULL DEFAULT '0', 
    `nameid` varchar(10) NOT NULL DEFAULT '', 
    `value ` mediumint(9) UNSIGNED NOT NULL DEFAULT '1' 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 CHECKSUM=1; 

我想是這樣的,但結果是不一樣的:

SELECT merkmalid, i.wert FROM infos AS i 
WHERE i.oid IN  
(
    SELECT * FROM 
    (
     SELECT ($1)   
    ) AS sub 
    WHERE i.nameid IN ($2) 
) 
+0

會創建表,臨時或其他,以包含這些列表的字符串和ID是可能性嗎?或者,這些列表是否正在生成,例如由一些應用程序代碼? –

+0

是否有理由使用'MyISAM'驅動程序而不是'INNODB'? –

+0

是的,這些列表是由一個應用程序生成的,我必須在查詢中使用它們。 – Mike

回答

0

IN (1,2,3)IN ("1,2,3")之間的差異。你可能想要前者。我不知道第一個SELECT給你什麼。請在插值後提供SELECT

子查詢只能給你後者。

我建議INDEX(nameid, oid, value)最有可能幫助。一旦你有了這個索引,你可能需要InnoDB充分利用它。