MySQL индексы, помогите разобраться

186
22 апреля 2018, 23:45

Есть простая таблица:

CREATE TABLE test_table
(
  id CHAR(36)               NOT NULL PRIMARY KEY,
  price            INT DEFAULT '0'        NOT NULL,
  week_day         INT                    NOT NULL,
  hour             INT                    NOT NULL,
  minute           INT                    NOT NULL,
  is_active        TINYINT(1) DEFAULT '0' NOT NULL
);
CREATE INDEX weekDay ON test_table (week_day);
CREATE INDEX test_index ON test_table (price, week_day, hour, minute);

делаю в нее запрос:

SELECT *
FROM test_table AS c2_
WHERE c2_.price > '0'
      AND c2_.price < '100000000000'
      AND c2_.week_day = '3'
      AND (c2_.hour >= '10' AND c2_.minute >= '00')
      AND (c2_.hour <= '22' AND c2_.minute <= '00')

Однако вижу, что используется индекс weekDay, а не по всем полям. Что я делаю не так?

Answer 1

Оптимизатор видит, что вы задали по price условие покрывающее собой всю БД, следовательно для его проверки ему придется просканировать весь индекс целиком, что не рационально, поэтому он отказывается его использовать. вот если бы по price был бы небольшой диапазон и оптимизатор это бы понял, то он бы вполне мог использовать индекс.

Вообще в индексе на первое место стоит ставить поля, поиск по которым идет на точное равенство. А поля, по которым поиск идет по диапазону должны быть последними при объявлении индекса.

Фактически любые индексы, по которым предполагается поиск по диапазону значений более чем по одному полю, малоэффективны. Потому как при сканировании диапазона по первому полю надо будет прыжками идти по кусочкам отвечающим за нужные значения второго поля. Но все равно придется пройти весь участок по первому полю.

READ ALSO
Выборка с бд Mysql с динамическим именем таблицы

Выборка с бд Mysql с динамическим именем таблицы

Подскажите пожалуйстаНужно сделать выборку с бд при это название таблицы, откуда делается выборка, образуется исходя из префикса таблицы...

183
Выборка по двум условиям mysql

Выборка по двум условиям mysql

Есть две таблицы, они связаны между собой один ко многимТаблица client содержит первичный ключ ID, а таблица orders содержит внешний ключ ID_of_client

193
MySQL + изображение

MySQL + изображение

Какой тип данных выбрать при составлении таблицы MySQL, для того чтобы можно было сохранять в нее изображения?

197
Реализация клиент серверного чата Qt c++

Реализация клиент серверного чата Qt c++

Здравствуйте, мне нужно реализовать данные вещи: - Я написал простенький чатик, но не могу понять, как реализовать личные сообщения(в голову...

190