索引中的位置

时间:2015-10-06 13:20:43

标签: php mysql

我有一个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', ...)

我现在知道这不起作用。但是,还有另一种方法可以实现这一目标吗?

2 个答案:

答案 0 :(得分: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', ...)

如果要保存一些内存,可以将两个INT组合成一个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并没有进行那种微不足道的优化。

答案 1 :(得分:0)

你能用这个:

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