Производительность, почему JOIN быстрее, чем IN - PullRequest
0 голосов
/ 22 января 2019

Я попытался оптимизировать некоторый код PHP, который выполняет множество запросов к разным таблицам (включая данные).

Логика заключалась в том, чтобы взять несколько полей из каждой таблицы по идентификатору района ( s ), в зависимости от того, был ли это город (множество идентификаторов районов) или конкретный район.

Например, предположим, что у меня есть 10 таблиц этого формата:

neighborhood_id     |     some_data_field

Запросы были примерно такими:

SELECT `some_data_field` 
FROM `table_name` AS `data_table` 
LEFT JOIN `neighborhoods_table` AS `neighborhoods` ON  `data_table`.`neighborhood_id' = `neighborhoods`.`neighborhood_id` 
WHERE `neighborhood`.`city_code` = SOME_ID

Поскольку было примерно 10 таких запросов, я попытался оптимизировать код, удалив объединение из 10 запросов и выполнив один запрос к таблице neighborhoods, чтобы получить все коды окрестностей.

Затем в каждом запросе я делал WHERE IN для идентификаторов окрестностей.

Ожидаемый результат - лучшая производительность, но оказывается, что она была не лучше.

Когда я выполняю запрос к своему серверу, первый запрос занимает 20 мс, второй - больше, а третий - больше и так далее. (второй и третий занимают примерно 200 мс), но при JOIN первый запрос занимает 40 мс, а остальные запросы - 20 мс-30 мс.

Первый запрос в запросе показывает нам, что где in быстрее, но я предполагаю, что MYSQL имеет некоторый кеш при работе с JOIN.

Итак, я хотел знать, как я могу импровизировать свои where в запросах?

EDIT Я прочитал ответ и комментарии и понял, что плохо объяснил, почему у меня есть 10 таблиц, поскольку каждая таблица классифицирована по свойству.

Например, одна таблица содержит значения по этажам, одну по комнатам и одну по дате поэтому невозможно union all таблиц к одной таблице.

Второе редактирование Я все еще не понял.
У меня нет только одного столбца данных на таблицу, каждая таблица имеет свое количество полей, это может быть 5 полей для одной таблицы и 3 для другой. и разные типы данных или типы форматирования, это может быть дата или деньги Кроме того, я выполняю в своих запросах некоторые вычисления для этих полей, иногда это может быть AVG или средневзвешенное значение, а в некоторых таблицах это только чистый выбор. Кроме того, я выполняю группировку по нескольким полям в одной таблице, это может быть по комнатам, а в другой - по этажу

1 Ответ

0 голосов
/ 22 января 2019

Например, предположим, что у меня есть 10 таблиц этого формата:

Это основа вашей проблемы.Не храните одну и ту же информацию в нескольких таблицах.Сохраните результаты в таблице single и позвольте MySQL оптимизировать запрос.

Если исходная таблица содержала «информацию» - скажем, месяц, когда были сгенерированы данные - тогда вам может понадобитьсявключите его в качестве дополнительного столбца.

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

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

Что быстрее, то IN или JOIN.Оба делают похожие вещи под капотом.В некоторых случаях один или другой быстрее, но оба должны использовать индексы и разделы, если они доступны.

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