php - 在索引上

扫码查看

我有一个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/

10-11 02:44
查看更多