【问题标题】:How can I quickly search posts/listings using multiple tags?如何使用多个标签快速搜索帖子/列表?
【发布时间】:2019-02-15 02:17:03
【问题描述】:

我的目录站点目前使用"toxi" table structure 来标记列表。

我的帖子表有大约 500 万条记录,而地图表有大约 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 等 }

主要术语_id

post_taxonomy_term_map { map_id, object_id, taxonomy, term_id}

PRIMARY map_id

INDEX object_id

INDEX term_id

索引分类

注意:post_taxonomy_term_map.object_id 与 posts.ID 值相关

【问题讨论】:

  • 使用正确的GROUP BY

标签: php mysql innodb


【解决方案1】:

可能主要的性能问题是由于 TOXI 要求的 many:many 表。可以消除:

CREATE TABLE Tags (
    tag VARHAR(...) NOT NULL,
    bid INT ... NOT NULL,
    PRIMARY KEY(tag, bid),
    INDEX(bid, tag)
)

注意事项:

  • 这比 TOXI 更好,因为它不会经过额外的 many:many 表,这使得优化变得困难。
  • 当然,由于冗余标签,我的方法可能稍微笨重(比 TOXI),但这只是 整个 数据库的一小部分,性能提升可能很显着。李>
  • 它具有高度可扩展性。
  • 它没有(因为它不需要)代理AUTO_INCREMENT PK。因此,它比 Scuttle 更好。
  • MySQLicious 很糟糕,因为它不能使用索引(LIKE 带有 前导 通配符;子字符串的错误命中)
  • 对于 MySQL,请务必使用 ENGINE=InnoDB 以获得“集群”效果。

相关讨论(针对 MySQL):
many:many mapping table optimization ,
ordered lists ,
而且,特别是对于 WP 用户, postmeta improvements

【讨论】:

    【解决方案2】:

    对于您的第一个查询:

    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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-28
      • 1970-01-01
      • 2014-06-11
      • 1970-01-01
      • 2020-12-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多