2015-10-06 46 views
0

我有一個MySQL表:凡在某個索引

id INT(10), 
property_id INT(10), 
value_id INT(10), 
.. 

有上PROPERTY_ID索引 '組合' + value_id

我有一個包含例如一個數組[1 => 68,4 = > 8,9 => 15,...]

代替此查詢:

SELECT * FROM table 
WHERE (property_id = 1 && value_id = 68) 
|| (property_id = 4 && value_id = 8) 
|| (property_id = 9 && value_id = 15) 
|| ... 

我希望的東西,因爲這會工作:

SELECT * FROM table WHERE combination IN ('1_68', '4_8', '9_15', ...) 

我現在知道這是行不通的。但是還有另一種方法可以實現這一目標嗎?

+1

只需使用您選擇的語言從該數組構建您的查詢 – Mihai

+0

Mihai,問題不在於如何創建數組。問題是:是否可以查詢索引而不是表中的字段。如果是這樣;怎麼樣? –

回答

1

在MySQL中,你可以使用元組條件:

SELECT * FROM table 
WHERE (property_id, value_id) IN (
    (1, 68), 
    (4, 8), 
    (9, 15) 
); 

這是它應該如何工作。但是 - MySQL不正確地使用索引。我們可以希望它有一天能夠完成(AFAIK適用於PostgreSQL)。

如果是關於性能而你現在需要它,那麼你可以考慮使用indexed virtual (generated) column(在MySQL 5.7.8中可用)。

ALTER TABLE `locations` 
ADD COLUMN `combination` VARCHAR(21) GENERATED ALWAYS AS CONCAT(property_id, '_', value_id), 
ADD INDEX `combination` (`combination`); 

現在你可以用你的查詢

SELECT * FROM table WHERE combination IN ('1_68', '4_8', '9_15', ...) 

如果你想節省一些內存,你可以兩個整數合併爲一個BIGINT

ADD COLUMN `combination` VARCHAR(21) GENERATED ALWAYS AS ((property_id << 32) + value_id) 

您也可以只使用UNION ALL

SELECT * FROM table WHERE (property_id, value_id) = (1,68) 
UNION ALL 
SELECT * FROM table WHERE (property_id, value_id) = (4,8) 
UNION ALL 
SELECT * FROM table WHERE (property_id, value_id) = (9,15) 

這將會很快。令人遺憾的是,MySQL並沒有進行這種微不足道的優化。

+0

在這種情況下,將不會使用索引使查詢非常慢。 –

+0

@PeterdeGroot,它仍然比使用連接速度快40%。 –

0

您可以使用此:

SELECT * FROM table WHERE concat(property_id,'_',value_id) IN ('1_68', '4_8', '9_15', ...) 
+0

在這種情況下,將不會使用索引使查詢非常慢。 –