我有一个名为items的 innodb 表,它为一个电子商务网站提供动力。搜索系统允许您搜索可选/附加字段,这样您就可以仅搜索维修过的计算机或仅超过 2000 年的汽车。
这是通过名为items_fields的附加表完成的。它有一个非常简单的设计:
+------------+------------------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| field_id | int(11) | NO | MUL | NULL | |
| item_id | int(11) | NO | MUL | NULL | |
| valueText | varchar(500) | YES | | NULL | |
| valueInt | decimal(10,1) unsigned | YES | | NULL | |
+------------+------------------------+------+-----+---------+----------------+
还有一个名为fields的表,其中仅包含字段名称和类型。
返回搜索结果的主要查询如下:
SELECT items...
FROM items
WHERE items... AND (
SELECT count(id)
FROM items_fields
WHERE items_fields.field_id = "59" AND items_fields.item_id = items.id AND
items_fields.valueText = "Damaged")>0
ORDER by ordering desc LIMIT 35;
在大规模(每天仅超过 400 万个搜索查询)上,我需要进一步优化这些高级搜索。目前,平均高级搜索查询大约需要 100 毫秒。
我怎样才能加快这个查询?您还有其他优化建议吗?两个表都是innodb,服务器堆栈绝对很棒,但是我仍然要解决这个查询:)