MYSQL: Какой индекс я должен создать в данном сценарии? - PullRequest
0 голосов
/ 02 февраля 2020

Предположим,

У меня есть веб-сайт, который показывает сообщения на основе Теги , Дата добавления , и если пользователю не понравился этот пост.

Я создам полнотекстовый индекс для столбца тегов.

Итак, я должен создать индекс только для столбца тегов
ИЛИ
Что я должен создать составной индекс (индекс столбца Мути) со всеми столбцами или только один индекс только со столбцом тегов?

Если ответ сложный индекс,
Какой тип индекса я должен создать? ПОЛНЫЙ ТЕКСТ? Будет ли он работать с двумя другими столбцами (Date and Likes)?

Likes - массив JSON, а Date - просто VARCHAR COLUMN!

1 Ответ

0 голосов
/ 03 февраля 2020

JSON, вероятно, будет ненужным осложнением.

Эти таблицы приходят на ум:

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

Обратите внимание, что Posts: Tags - это 1: многие. То же самое для Лайков.

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"
...