Проблема с типами TEXT при индексировании SQL Таблица базы данных - PullRequest
0 голосов
/ 13 июля 2020

Я работаю над проектом, в котором наша команда имеет много c таблиц статистики в нашей базе данных. Я хочу создать индексы для этих таблиц, чтобы повысить производительность. К сожалению, я получаю сообщение об ошибке:

Код ошибки: 1170. Описание столбца BLOB / TEXT, используемого в спецификации ключа без длины ключа

Указанный столбец ' description 'определяется как MEDIUMTEXT.

Я обнаружил, что типы ТЕКСТА не могут быть проиндексированы, и хочу изменить все ненужные типы ТЕКСТА на VARCHAR (255) и применить SQL Индексы после этого.

Большинство SQL выражений, которые мы используем, запрашивают все атрибуты таблицы. В нашей самой важной таблице (в отношении индексации) только один атрибут должен оставаться MEDIUMTEXT. Но мы всегда выбираем всю строку (включая описание MEDIUMTEXT).

Итак, мой вопрос: поскольку я не могу изменить эту спецификацию c MEDIUMTEXT на VARCHAR: могу ли я отказаться от индексации этой таблицы? Получу ли я прирост производительности, если проиндексирую каждый атрибут, несмотря на MEDIUMTEXT?

Заранее спасибо ...

Ответы [ 2 ]

2 голосов
/ 13 июля 2020

Вот как вы можете создать ИНДЕКС в поле MEDIUMTEXT:

CREATE TABLE textindexexample(
   name MEDIUMTEXT,
   INDEX(name(255))
);

То же самое, если вам понадобится КЛЮЧ. В существующую таблицу вы можете добавить ее следующим образом:

CREATE INDEX idx ON textindexexample(name(255));

Обратите внимание, что я проиндексировал только первые 255 символов. Это означает, что если два разных текста начинаются с одной и той же последовательности символов в начале, они будут рассматриваться как равные по индексу. Максимальный размер индекса составляет 3072 байта. Так что не более чем name (3072) в обычной кодировке ascii.

Относительно второго вопроса: нет, вы не получите повышения производительности, если все проиндексируете. На самом деле все наоборот - производительность может снизиться, потому что индексы необходимо поддерживать (обновлять, как только вы добавляете данные).

Вы должны индексировать только те столбцы, которые вы используете. Например, поля, которые вы используете в WHERE и JOIN.

1 голос
/ 13 июля 2020

В MySQL есть такая вещь, как FULLTEXT search, где вы можете установить индекс.

FULLTEXT INDEX (описание)

Индекс помогает фильтровать результаты за счет дополнительных место для хранения и дополнительные записи на диск. Чем больше индексов, тем медленнее будет запись в таблицы. Вы должны индексировать только те столбцы, которые вы фактически фильтруете в ваших операторах WHERE или к которым вы присоединяетесь.

Если вы действительно ищете описания, то, вероятно, вам нужен FULLTEXT поиск. Это очень мощная функция.

https://dev.mysql.com/doc/refman/8.0/en/fulltext-search.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...