我的目录站点当前使用 "toxi" table structure用于标记列表。
我的帖子表有大约 500 万条记录, map 表有大约 1500 万条记录。
我使用术语来存储各种信息,如作者、出版商、主题、媒介(例如音频、视频等)。一篇文章的每个分类可以有多个术语(多个作者、多个主题等)。
基于单个 term_id 搜索帖子大约需要 4 秒才能返回结果,这非常糟糕,但使用多个术语则需要 40 秒才能返回结果。
我需要一个更有效的解决方案,但我无法确定是我的查询效率低还是我的表结构效率低。
== 单项搜索查询 ==
SELECT * FROM posts
LEFT JOIN post_taxonomy_term_map ON (posts.ID = post_taxonomy_term_map.object_id)
WHERE post_taxonomy_term_map.term_id=$term1
== 多个术语搜索查询 ==
SELECT p.*
FROM post_taxonomy_term_map m, posts p
WHERE m.term_id IN ($term1, $term2, $term3)
AND p.ID = m.object_id
GROUP BY p.ID
HAVING COUNT( p.ID )=3
表格和列
帖子 { ID、post_title 等... }
主要ID
taxonomy_terms { term_id、term_label、term_slug 等 }
主要 term_id
post_taxonomy_term_map {map_id、object_id、分类、term_id}
主要map_id
INDEX object_id
INDEX term_id
索引分类
注意:post_taxonomy_term_map.object_id 与 posts.ID 值相关
最佳答案
对于您的第一个查询:
SELECT *
FROM posts
LEFT JOIN post_taxonomy_term_map
ON posts.ID = post_taxonomy_term_map.object_id
WHERE post_taxonomy_term_map.term_id = $term1
(term_id, object_id) 上的复合索引
。该索引包括 term_id
,这是一个或您的索引已经执行的操作,但它还通过包含 object_id
来覆盖连接。假设优化器认为 WHERE
子句的限制足以使用索引,那么这应该比您当前拥有的性能更好。
CREATE INDEX some_idx ON post_taxonomy_term_map(term_id, object_id);
关于php - 如何使用多个标签快速搜索帖子/列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52261297/