Функция LOCATE в столбце TEXT - PullRequest
0 голосов
/ 11 марта 2020

Можно ли использовать функцию Locate () для столбца TEXT или есть какая-то альтернатива ей для полей TEXT.

дело в том, что у нас есть БОЛЬШИЕ varchars (65kb), которые мы используем для отслеживания подписки, поэтому мы добавляем subscription_ids внутри 1 длинной строки в varchar.

эта строка может содержать до 5000 subscription_ids в 1 строке. мы используем LOCATE, чтобы увидеть, подписан ли пользователь. если внутри строки varchar обнаружен идентификатор subscription_id.

проблема заключается в том, что мы планируем создать более 500 000 таких строк, и это может оказать значительное влияние на производительность.

, поэтому мы решил вместо этого перейти к TEXT, но теперь существует проблема с индексацией и с тем, как расположить подтекст внутри столбца TEXT.

1 Ответ

1 голос
/ 22 марта 2020

миллиарды подписок? Пожалуйста, покажите сокращенный пример значения TEXT. Вы пробовали FIND_IN_SET()?

В одном поле TEXT отображается до 5000 подписок для одного пользователя? Или наоборот - до 5 тысяч пользователей на один журнал?

В любом случае было бы лучше иметь таблицу с двумя столбцами:

CREATE TABLE user_sub (
    user_id INT UNSIGNED NOT NULL,
    sub_id INT UNSIGNED NOT NULL,
    PRIMARY KEY(user_id, sub_id),
    INDEX(sub_id, user_id)
) ENGINE=InnoDB;

Два составных индексы позволяют очень эффективно находить подписки 5 КБ для пользователя или 500 КБ для подпрограммы.

Сократить идентификатор менее 500 КБ до MEDIUMINT UNSIGNED (ограничение 16 МБ вместо 4 миллиардов; 3 байта вместо 4 ).

Сокращение идентификатора less-5K до SMALLINT UNSIGNED (ограничение 64K вместо 4B; 2 байта вместо 4).

Если вы хотите, вы можете использовать GROUP_CONCAT() для реконструировать коммалист. Обязательно измените group_concat_max_len на достаточно большое число (по умолчанию только 1024 байт .)

...