【发布时间】:2012-11-01 22:05:53
【问题描述】:
我有一个名为 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,服务器堆栈绝对很棒,但是我仍然要解决这个查询:)
【问题讨论】:
-
您是否只想要在项目字段中具有特定字段的所有项目的列表?你能发布一个你想要的结果集的例子吗?
-
另外,您是否总是对您正在寻找的字段/值对的“属性”表进行查询?另外,对于 item_fields 表,我至少会在 (field_id, valueText) 和 (field_id, valueInt) 上有一个索引
标签: mysql optimization count large-scale