2013-09-02 3 views
0

Чтобы сделать систему более эффективной, следует ли уменьшить количество IO базы данных или уменьшить размер операции с данными?Уменьшить количество операций ввода-вывода базы данных или размер данных?

В частности, предположим, что я хочу получить лучшие 60-70 объектов.

первый подход:

Объединив несколько столов, я получил огромный стол здесь. Затем сортировка таблицы на основе некоторых атрибутов и возвращение 70 лучших объектов со всеми ее атрибутами, и я использую только 60-70 объектов.

второй подход:

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

Итак, какой из них лучше с точки зрения эффективности, esp для MySQL.

+1

Это своего рода неопределенный вопрос, но, скорее всего, вариант 1 будет дешевле. – Brandon

+2

Как общее правило, вы хотите уменьшить количество вызовов в базе данных. Но, как всегда, с производительностью, вы не должны угадывать: измерьте, что у вас есть, внесите корректировки, а затем сравните эффект до и после. Имейте в виду, что эти факторы могут измениться в течение срока службы приложения (по мере увеличения объема данных или увеличения количества пользователей/трафика) – troelskn

ответ

0

Как правило, наилучшим способом оптимизации запросов является объединение двух подходов, которые вы представляете.

SELECT col, col, col, col, etc 
    FROM tab1, 
    JOIN tabl2 ON col = col 
    JOIN tabl3 ON col = col 
    WHERE tab1.id IN 
    (SELECT distinct tab1.id 
     FROM whatever 
     JOIN whatever ON col = col 
     WHERE whatever 
     ORDER BY col DESC 
     LIMIT 70 
    ) 

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

+0

Я не уверен, что оптимизатор MySQL не делает такого рода вещи. Я имею в виду, возможно (если оптимизатор достаточно хорош) MySQL использовал бы только таблицы JOINed, когда они фактически используются в предложении WHERE на первом шаге. Если это так, подзапрос бесполезен и может быть еще более неэффективным, чем сразу написать JOINed-запрос - что я * думаю *. – Kaii

+0

По моему опыту такой запрос - это terribad. Подобный MySQL повторяет вложенный SELECT для каждой строки или что-то глупое. – Havenard

+0

@Havenard это только при использовании подзапроса в части SELECT вашего запроса.Использование подзапросов в качестве производного списка в предложении WHERE или в виде производной таблицы для JOINing неплохо вообще, но * может быть бесполезным * и * может оптимизировать оптимизатор оптимизатора * в зависимости от варианта использования. – Kaii

1

Это будет зависеть от того, как вы разработали свой запрос.

Обычно JOIN операций являются более эффективными, чем при использовании IN (group) или вложенных SELECT с, но при соединении 3 или более таблиц, вы должны тщательно выбрать порядок, чтобы оптимизировать его.

И, разумеется, для каждой таблицы bind необходимо envolve PRIMARY KEY.

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

Это обычная практика, когда результаты тяжелого запроса часто требуются в системе.

Вы всегда можете рассчитывать на MySQL Workbench, чтобы измерять скорость ваших запросов и играть с вашими параметрами.

Смежные вопросы