Для нормализации вам, вероятно, понадобятся как минимум две таблицы.
Один для простого удержания ключевых слов (и легко и быстро ссылающегося значения keyword_id).
Вторая таблица для "index", hold (ключевое слово_id, post_id, номер_строки). Наличие полей, содержащих счетчики, становится немного избыточным, когда простые запросы «счетчика» в этой индексной таблице могут давать те же результаты без необходимости синхронизации со строковыми данными.
Затем, чтобы найти сообщения с вашими ключевыми словами, вы можете просто сделать запрос, подобный этому:
SELECT i.post_id, COUNT(DISTINCT i.keyword_id) AS keywordsUsed
FROM keywords AS k
INNER JOIN keywords_index AS i ON k.keyword_id = i.keyword_id
WHERE k.keyword IN ( 'your', 'list', 'of', 'keywords')
GROUP BY i.post_id
ORDER BY keywordsUsed DESC
;
или это
SELECT post_id, COUNT(DISTINCT keyword_id) AS keywordsUsed
FROM keywords_index
WHERE keyword_id IN (
SELECT keyword_id
FROM keywords
WHERE keyword IN ( 'your', 'list', 'of', 'keywords')
)
GROUP BY post_id
ORDER BY keywordsUsed DESC
;
Еще одна вещь, которую стоит иметь в виду, заключается в том, что хотя эта таблица выглядит намного больше (намного больше строк), она, вероятно, будет занимать гораздо меньше фактического пространства (и из-за этого будет быстрее получать к ней доступ):
Строка [[113, 1, [822]], [199, 1, [11592]],[267, 1, [5293
- это минимум 50 байтов (при условии однобайтового набора символов), без учета спецификатора длины для самой строки. Даже удаление значений счетчика и связанных с ним запятых и пробелов только уменьшает данные на 9 байт.
113, 822
199, 11592
267, 5293
24 байта, при условии, что INT используется для значений идентификатора.