我想通過標籤搜索對象。我想出了第一種方法是以下模式:在最短時間內通過多個標籤搜索對象
Object(OID, Tags, ...)
Tag(TagID, Name, ...)
ObjectTag(OID, TagId)
領域Tags
包含所有標籤名稱。
現在我不僅想通過一個標籤進行搜索,而是通過多個標籤進行搜索。查詢是這樣的:
SELECT `o`.*
FROM Object o
INNER JOIN ObjectTag tag1 ON(o.OID = tag1.OID)
INNER JOIN ObjectTag tag2 ON(o.OID = tag2.OID)
...
INNER JOIN ObjectTag tagn ON(o.OID = tagn.OID)
WHERE tag1.TagID = ? AND tag2.TagID = ? AND ... AND tagn.TagID = ?
我約100K的對象和每個對象的5-20標籤測試這一點,並花了大約30秒以上,因此往往超過PHP的時限。
出於好奇,我還嘗試使用LIKE
根據字段標籤進行查詢。
SELECT `o`.*
FROM object
WHERE object.tags LIKE '%tag1%' AND object.tags LIKE = '%tag2%' ...
但是,這個查詢是在10秒內執行的。不知何故,我可以理解,掃描一個表比交叉操作快,但這樣我就不能使用索引。
我的目標是響應時間,不會嚇跑用戶。
只要'%'只在最後就可以使用索引。但這不是真正的答案......但是,「標籤包含所有標籤名稱」這一說法與設計相矛盾。因此,什麼是ObjectTag表的要點? – Strawberry
@Strawberry該字段存在其他原因。我列出它是因爲我在第二個查詢中使用了它。 –