Я работал на разные компании, и я заметил, что некоторые из них предпочитают иметь представления, которые присоединятся к столу со всеми его «родственниками». Но затем в приложении несколько раз нам нужно использовать только 1 столбец.
Так будет ли быстрее просто делать простые выборки, а затем «присоединять» их к системному коду?
Система может быть php, java, asp, любой язык, который подключается к базе данных.
Таким образом, вопрос заключается в том, что быстрее перейти от серверной части (php, java, asp, ruby, python ...) к базе данных, выполнить один запрос, чтобы получить все необходимое, или перейти со стороны сервера в базу данных и запустить запрос, который только получить столбцы из одной таблицы в то время?
mysql
postgresql
performance
join
sudo.ie
источник
источник
Ответы:
Что бы ответить на ваш вопрос - тема «СОВМЕСТНОЕ ДЕКОМПОЗИЦИЯ».
Согласно странице 209 Книги
Вы можете разложить объединение, выполнив несколько запросов к одной таблице вместо многопользовательского объединения, а затем выполнив объединение в приложении. Например, вместо этого одного запроса:
Вы можете запустить эти запросы:
С какой стати ты это сделал? На первый взгляд это выглядит расточительно, потому что вы увеличили количество запросов, не получив ничего взамен. Однако такая реструктуризация может дать существенные преимущества в производительности:
mysql
уже кэширован, приложение пропустит первый запрос. Если вы найдете в кэше сообщения с идентификатором 123, 567 или 908, вы можете удалить их изIN()
списка. Кэш запросов также может извлечь выгоду из этой стратегии. Если часто изменяется только одна из таблиц, декомпозиция объединения может уменьшить количество недействительных кэшей.IN()
списка вместо объединения позволяет MySQL сортировать идентификаторы строк и извлекать строки более оптимально, чем это возможно при объединении.В результате объединения операций в приложении могут быть более эффективными, когда вы кэшируете и повторно используете много данных из предыдущих запросов, распределяете данные по нескольким серверам, заменяете объединения
IN()
списками или объединение ссылается на одну и ту же таблицу несколько раз.НАБЛЮДЕНИЯ
Мне нравится первый пункт, потому что InnoDB немного неуклюж, когда проверяет кеш запросов.
Sep 05, 2012
: Стоит ли когда-нибудь издержек частой аннулирования кэша запросов?Jun 07, 2014
: Почему query_cache_type отключен по умолчанию, начиная с MySQL 5.6?Что касается последнего пункта, я написал сообщение от 11 марта 2013 г. ( есть ли разница в выполнении между условием JOIN и условием WHERE? ), В котором описывается алгоритм вложенного цикла. Прочитав его, вы увидите, насколько хорошей может быть декомпозиция соединения.
Что касается всех остальных пунктов книги , разработчики действительно смотрят на производительность как на практический результат. Некоторые полагаются на внешние средства (вне приложения) для повышения производительности, такого как использование быстрого диска, получение большего количества процессоров / ядер, настройка механизма хранения и настройка файла конфигурации. Другие будут сгибаться и писать лучший код. Некоторые могут прибегнуть к кодированию всей бизнес-аналитики в хранимых процедурах, но по-прежнему не применяют декомпозицию объединения (см. Каковы аргументы против или для размещения логики приложения на уровне базы данных? Вместе с другими публикациями). Все зависит от культуры и терпимости каждого разработчика.
Некоторые могут быть довольны производительностью и больше не трогать код. Другие просто не понимают, что есть большие преимущества, которые можно получить, если они попытаются присоединиться к композиции.
Для тех разработчиков, которые готовы ...
ДАЙТЕ ЭТО ПОПРОБУЙТЕ !!!
источник
В Postgres (и, вероятно, в любой СУБД в аналогичной степени, MySQL в меньшей степени) почти все запросы выполняются намного быстрее.
Затраты на анализ и планирование нескольких запросов в большинстве случаев уже превышают любую возможную выгоду.
Не говоря уже о дополнительной работе, которую нужно выполнить в клиенте, объединяя результаты, которые обычно гораздо медленнее. СУБД специализируется на таких задачах, а операции основаны на исходных типах данных. Запрещается
text
приводить к промежуточным результатам или возвращать их для собственных типов клиентов, что может даже привести к менее правильным (или неправильным!) Результатам. Подумайте о числах с плавающей точкой ...Вы также передаете больше данных между сервером БД и клиентом. Это может быть незначительным для руки, полной ценностей, или иметь огромное значение.
Если несколько запросов означают несколько обращений к серверу базы данных, вы также собираете многократно сетевую задержку и накладные расходы транзакции, возможно, даже накладные расходы соединения. Большая, большая потеря.
В зависимости от вашей настройки, задержка одной сети может занять больше времени, чем все остальные, на несколько порядков.
Связанный вопрос по SO:
Для очень больших и длительных запросов может быть поворотный момент , поскольку транзакции собирают блокировки на строках БД в пути. Очень большие запросы могут удерживать много блокировок в течение продолжительного периода времени, что может вызвать трения при одновременных запросах .
источник
returns lots of redundant data for "parent" table
: Зачем вам возвращать избыточные данные? Верните только те данные, которые вам нужны.