каков наилучший способ оптимизировать запрос на соединение с несколькими операторами AND?


Я разрабатываю систему онлайн-бронирования, в которой люди могут бронировать товары в зависимости от их наличия на определенное время дня. Для этого я использую две таблицы 1.Item 2.Reservation

 Item:(InnoDB)
 -------------------------
 id INT (PRIMARY)
 category_id MEDIUMINT
 name VARCHAR(20)
 make VARCHAR(20)
 availability ENUM('1','0')

 Reservation:(InnoDB)
 -------------------------
 id INT (PRIMARY)
 date DATE
 Item_id INT
 slot VARCHAR(50)

SELECT Item.id,Item.category,Item.make,Item.name,reservation.slot
FROM Item 
INNER JOIN reservation ON Item.id=reservation.Item_id AND Item.category_id=2
  AND Item.availability=1 AND reservation.date = DATE(NOW());

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

Поле slot в таблице резервирования содержит строку (пример: 0:1:1:1:0:0:0:0:0:0:0:0:1:1:1:0:0 :0:0:0:0:0:0:0), где 1 означает, что час зарезервирован, а 0 означает, что он доступен.

доступность в таблице элементов показывает, доступен ли этот элемент для резервирования или нет (может быть недоступен для обслуживания).

Во-первых, в порядке ли моя структура таблицы? Во-вторых, как лучше всего оптимизировать мой запрос (многостолбцовая индексация и т. д.).

спасибо,
Рави.


person ravi    schedule 11.06.2012    source источник
comment
у вас есть индексы?   -  person FSP    schedule 11.06.2012
comment
Не знаете mysql, но у него нет встроенного анализатора запросов?   -  person Limey    schedule 11.06.2012
comment
@FSP нет. Пожалуйста, предложите лучший способ.   -  person ravi    schedule 11.06.2012


Ответы (4)


Поместите ограничение внешнего ключа и индексируйте свой FK, это должно немного ускорить работу. Похоже, вы смешиваете INT для идентификатора предмета и MEDIUMINT для FK, не уверен, что это то, что задумано природой.

person Jeff Watkins    schedule 11.06.2012
comment
@ Jeff Watkins FK is INT, извините за опечатку. FK оптимизирует INNER JOIN, но как насчет предложений AND? - person ravi; 11.06.2012
comment
Я согласен с ответом Тома Смита, для чистоты кода уберите AND из соединения и создайте предложение WHERE. - person Jeff Watkins; 11.06.2012

О чем следует помнить при выборе атрибута, по которому будет создан индекс

Столбец, который часто используется в списке SELECT и предложении WHERE.
Столбец, доступ к данным в котором осуществляется последовательно по диапазону значений.
Столбец, который будет использоваться с GROUP By или ORDER BY предложение для сортировки данных.
Столбец, используемый в соединении, например столбец FOREIGN KEY.
Столбец, используемый в качестве PRIMERY KEY.
Попробуйте создать индекс для числовых значений. может ввести суррогатный ключ, если нет числового pK.

person Romil Kumar Jain    schedule 11.06.2012

Почему вы помещаете все эти условия в предложение соединения? Почему бы и нет:

SELECT Item.id,Item.category,Item.make,Item.name,reservation.slot
FROM Item INNER JOIN reservation ON Item.id=reservation.Item_id
WHERE Item.category_id=2 AND Item.availability=1 AND reservation.date = DATE(NOW());

Я не настолько эксперт по SQL, чтобы сказать, сделает ли это быстрее, но мне это кажется более очевидным.

person Thom Smith    schedule 11.06.2012

Я бы предложил создать индекс для Reservation.item_id. Это должно помочь вам улучшить производительность запросов.

person FSP    schedule 11.06.2012