php - 如何使用多个标签快速搜索帖子/列表?

标签 php mysql innodb

我的目录站点当前使用 "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/

相关文章:

javascript - 更改选择上的 php 函数

php - 将数据与数据库中的表进行比较

mysql - SQL if 查询功能

mysql - Percona 社区版和 MySql 社区版给出 “InnoDB: page_cleaner: 1000ms intended loop took 0ms” ?

使用 InnoDB 引擎创建表时出现 MySQL 1005 错误

php在html中显示mysql表

php - 网络广播流代理

MYSQL INET_NTOA 与 Mybb 中的 IP

php - 事件提要结构

MySQL 解释 - 需要索引建议/反馈