Как сделать более быстрый запрос при объединении нескольких огромных таблиц? - PullRequest
1 голос
/ 06 апреля 2019

у меня 3 таблицы.Все 3 таблицы имеют приблизительно 2 миллиона строк.Каждый день вводятся 10 000-100 000 новых записей.Требуется приблизительно 10 секунд, чтобы закончить заявление sql ниже.Есть ли способ сделать этот оператор SQL быстрее?

SELECT customers.name
FROM customers
INNER JOIN hotels ON hotels.cus_id = customers.cus_id
INNER JOIN bookings ON bookings.book_id = customers.book_id
WHERE customers.gender = 0 AND
customers.cus_id = 3
LIMIT 25 OFFSET 1;

Конечно, этот оператор работает хорошо, но он медленный.Есть ли лучший способ написать этот код?

Ответы [ 3 ]

0 голосов
/ 06 апреля 2019

Все серверы баз данных имеют форму механизма оптимизации, который определит, как лучше всего получить нужные вам данные.С помощью простого запроса, такого как выбранный вами выбор, не будет никакого способа значительно повысить производительность в SQL.Как говорили другие, подзапросы не помогут, так как они будут оптимизированы под тот же план, что и объединения.

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

Рассмотрим кеширование.Я не эксперт по MySQL, но нашел эту статью интересной и заслуживающей внимания.https://www.percona.com/blog/2011/04/04/mysql-caching-methods-and-tips/

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

0 голосов
/ 06 апреля 2019

Мне трудно поверить, что это связано с реальной проблемой. Как написано, я ожидаю, что это будет возвращать одно и то же имя клиента снова и снова.

Я бы порекомендовал следующие индексы:

  • customers(cus_id, gender, book_id, name)
  • hotels(cus_id)
  • bookings(book_id)

Действительно странно, что bookings не в отеле.

Во-первых, эти индексы охватывают запрос, поэтому доступ к страницам данных не требуется. Логика заключается в том, чтобы начать с предложения where и сначала использовать эти столбцы. Затем добавьте дополнительные столбцы из предложений on и select.

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

Использование OFFSET без ORDER BY весьма подозрительно. В любом случае результирующий набор имеет неопределенный порядок, поэтому нет оснований пропускать номинально «первое» значение.

0 голосов
/ 06 апреля 2019

Подзапрос не помогает, но правильный индекс может улучшить производительность, поэтому убедитесь, что у вас есть правильный индекс

 create  index  idx1 on customers(gender , cus_id,book_id, name )

 create index  idex2 on hotels(cus_id)

 create index  idex3 on hotels(book_id)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...