我有一个mySql表:
id INT(10),
property_id INT(10),
value_id INT(10),
..
在property_id + value_id上有一个索引“组合”
我有一个包含例如[1 => 68,4 => 8,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', ...)
我现在知道这行不通。但是还有另一种方法可以实现这一目标吗?
最佳答案
在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并未进行如此微不足道的优化。
关于php - 在索引上,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32971098/