【问题标题】:MYSQL: Which index should I create in the scenario given?MYSQL:在给定的场景中我应该创建哪个索引?
【发布时间】:2020-02-02 15:29:44
【问题描述】:

假设,

我有一个网站根据标签上传日期以及用户是否不喜欢该帖子来显示帖子。

我将在标签列上创建全文索引。

那么,我应该只在标签列上创建索引吗?

我应该用所有列创建复合索引(多列索引)还是只用标签列创建单个索引?

如果答案是复合索引,
我应该创建什么类型的索引?全文?它是否适用于其他两列(日期和喜欢)?

Likes 是一个 JSON 数组,而 Date 只是一个 VARCHAR COLUMN!

【问题讨论】:

  • 这实际上取决于您将如何在需要的查询中使用列。因此,为了获得最佳建议,请向我们展示一些查询和数据样本。通常,要索引的列是那些在 where 子句、order by 子句或 join 语句中使用的列。我还建议开始阅读有关索引优化和使用的信息。 dev.mysql.com/doc/refman/5.5/en/optimization-indexes.html
  • 向我们展示表格中一行的样本。特别值得注意的是您如何处理多个标签,您只搜索一个标签。您是否在单列中有标签列表或什么?是否通过撞柜台来存储“喜欢”?或者列出喜欢的人和时间的详细信息。

标签: mysql indexing full-text-search


【解决方案1】:

JSON 可能是不必要的复杂化。

我想到了这些表格:

Posts:  post_id, date_uploaded, ...
Tags:   post_id, tag (a string) (one row per tag)
Likes:  user_id, post_id

请注意 Posts:Tags 是 1:many。喜欢也一样。

SELECT  ...,
        p.date_uploaded,
        ( SELECT GROUP_CONCAT(tag) FROM Tags
            WHERE post_id = p.post_id
              AND tag = ?
            )  AS tags,
        IF( EXISTS( SELECT 1 FROM Likes WHERE post_id = p.post_id
                   AND user_id = ? ),
               "they like it",
               "they don't like it" ) AS liked
    FROM Posts AS p
    WHERE ...

需要索引:

Tags:  INDEX(post_id, tag) -- for "Which Tags does this Post have" (this query)
Tags:  INDEX(tag, post_id) -- for "what Posts have this Tag"
Likes: INDEX(user_id, post_id)  -- for "what Posts does this user Like"
Likes: INDEX(post_id, user_id)  -- for "which users Like this Post"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 2012-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多