@litvin2

Как эффективно организовать таблицу для 250 000 записей?

Коллеги, подключайтесь.

Упрощенная модель такова: таблица POST_ID, KEY, VALUE, которая хранит разные данные для элементов (записей) на сайте.

  1. (BIGINT(20)) POST_ID – ID для элемента на сайте
  2. (VARCHAR(30)) KEY – название поля у элемента
  3. (LONGTEXT) VALUE – значение поля


В таблице может быть несколько строк с одной парой POST_ID и KEY.
VALUE может принимать значения как в один символ, так и в длинные статьи по 4 000 000 знаков.

Мы изначально реализовали хранение, принято везде: например, и Wordpress, и Битрикс хранят такие "пользовательские" данные в одной таблице и точно в таком же формате.

Сейчас возникают опасения, так как подобные выборки выполняются долго:
SELECT POST_ID FROM TABLE WHERE KEY='qwrety' AND VALUE='asdfghjk12345678'


Я подумываю над решением, как это делают с файлами: создать 26 таблиц A, B, C, D... и хранить в каждой KEY начинающийся с соответствующей буквы.

Коллеги, поделитесь опытом – как эту организацию в 250 000 записей можно оптимизировать?
  • Вопрос задан
  • 246 просмотров
Пригласить эксперта
Ответы на вопрос 3
Melkij
@Melkij
PostgreSQL DBA
Если вам действительно, в реальности, зачем-то нужно делать where value = "4 миллиона знаков", то сделайте hash-индекс.
Mysql их не умеет, так что велосипедим рядом ещё одним полем, в которое пишете результат хэш-функции от этого самого текста. И индексируем обычным btree. Например, md5 или даже просто crc32
В запросе, соответственно, where hash = посчитанный хэш and value = "4 миллиона знаков"
Ответ написан
MaxDukov
@MaxDukov
впишусь в проект как SRE/DevOps.
попробуйте полнотекстовый поиск для VALUE.
будет индекс - по 250 000 строкам будет искать моментально.
Ответ написан
Sanasol
@Sanasol
нельзя просто так взять и загуглить ошибку
SELECT POST_ID FROM TABLE WHERE KEY='qwrety' AND VALUE='asdfghjk12345678'


Т.е. может быть where value = "4 миллиона знаков"

Что-то вы неправильно делаете значит вообще.

Зачем по value искать что-либо?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы