使用以下表结构:
项目(约 20,000 条记录)
- item_id
属性(约 30 条记录)
- property_id
Item_properties(约 40,000 条记录)
- ID
- property_id
- item_id
用户可以选择通过items
表本身中的多个字段来过滤项目,也可以选择properties
项目必须具有的任意数量。搜索需要选择具有所有属性的项目,而不仅仅是其中一个。我目前使用的格式
SELECT item.field...
FROM items
INNER JOIN item_properties AS ip1 ON ip1.item_id=item.item_id and ip1.property_id=3
INNER JOIN item_properties AS ip2 ON ip2.item_id=item.item_id and ip2.property_id=4
INNER JOIN item_properties AS ip3 ON ip3.item_id=item.item_id and ip3.property_id=5
INNER JOIN item_properties AS ip4 ON ip4.item_id=item.item_id and ip4.property_id=6
etc...
WHERE item.something_else='words'
GROUP BY item_id
我也尝试过,作为一种纯粹通过 WHERE 而不是 JOIN 指定搜索的方式
SELECT item.field...
FROM items
WHERE item.something_else='words'
and item_id IN (select item_id from item_properties where property_id=3)
and item_id IN (select item_id from item_properties where property_id=4)
and item_id IN (select item_id from item_properties where property_id=5)
and item_id IN (select item_id from item_properties where property_id=6)
etc...
然而,如果有的话,这种方法似乎需要更长的时间来查询集合。选择了大约 4 个属性,查询时间大约是 4-5 秒,而且查询往往会被杀死或完全关闭 MySQL 服务器。
据我所知,所有 _id 字段都在每个表上建立索引,它们也是各自表的主键。
有没有办法改进查询,或者我可能需要限制可以查询的选项数量?