Я попытался оптимизировать некоторый код 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
или средневзвешенное значение, а в некоторых таблицах это только чистый выбор.
Кроме того, я выполняю группировку по нескольким полям в одной таблице, это может быть по комнатам, а в другой - по этажу