Индексирует ли MySQL (InnoDB) нулевые значения в составном индексе?

Владимир Соколов
Владимир Соколов
  • Сообщений: 14
  • Последний визит: 20 января 2025 в 01:48

Предположим, у меня есть таблица с 1 миллионом строк и множеством столбцов. X и Y — два столбца varchar. Для 0,1% строк значения имеют как X, так и Y. Для остальных 99,9% строк X и Y имеют значение NULL. Предположим, я создаю составной индекс BTree для (X,Y).

Собирается ли MySQL индексировать все эти нули?

Я получу отличную производительность, если буду запрашивать только X или X и Y вместе. Но буду ли я платить небольшой штраф каждый раз, когда вставляю или обновляю новую запись, где X и Y равны нулю? 

Автотрейд
Автотрейд
  • Сообщений: 14
  • Последний визит: 20 января 2025 в 01:49

Если вы создадите индекс на

table(col1, col2)
, и ты делаешь
WHERE col1 = 'something' AND col2 = 'something'
вы будете использовать индекс; это будет очень избирательно. То же самое с
WHERE col1 = 'something'

Но

WHERE col1 IS NOT NULL
вам придется протестировать.
WHERE col1 IS NULL
будет сканировать таблицу, поскольку в этой ситуации индекс вовсе не является избирательным.

Обновление индекса с помощью INSERT или UPDATE требует небольших накладных расходов. Это не может быть УНИКАЛЬНЫЙ индекс, поэтому рабочая нагрузка немного меньше. Но в большинстве случаев об этом не стоит беспокоиться, если только ваша рабочая нагрузка INSERT/UPDATE не намного тяжелее рабочей нагрузки SELECT. Если вы можете сделать столбцы

COLLATE latin1_bin
вы получите максимально легкие индексы. Но никаких смайлов, китайских иероглифов или нечувствительности к регистру.

Редактировалось: 1 раз (Последний: 20 января 2025 в 01:45)
Авторизуйтесь, чтобы писать на форуме.

Заявка на услуги DST

Наш специалист свяжется с вами, обсудит оптимальную стратегию сотрудничества,
поможет сформировать бизнес требования и рассчитает стоимость услуг.

Адрес

Ижевск, ул. Воткинское шоссе, д. 170 Е, Технопарк Нобель, офис 1117

8 495 1985800
Заказать звонок

Режим работы: Пн-Пт 10:00-19:00

info@dstglobal.ru

Задать вопрос по почте

Укажите ваше имя
Укажите ваше email
Укажите ваше телефон