Производительность MySQL – несколько запросов или один неэффективный запрос?

У меня три таблицы, каждая из которых содержит некоторую общую информацию и некоторую информацию, которая уникальна для таблицы. Например: uid , date является универсальной среди таблиц, но одна таблица может содержать type столбца, а другая – currency . Мне нужно запросить базу данных и получить последние 20 записей ( date DESC ), которые были введены во всех трех таблицах. Мои параметры:

  1. Запросите базу данных один раз, с одним большим запросом, содержащим три предложения UNION ALL и передайте поддельные значения для столбцов, IE:

     FROM ( SELECT uid, date, currency, 0, 0, 0 

    и позже

     FROM ( SELECT uid, date, 0, type, 0, 0 

    Это оставило бы меня с выделенными нулевыми полями.

  2. ИЛИ я могу запросить базу данных три раза, и как-то в PHP sort информацию, чтобы получить объединенные последние 20 сообщений. Это оставило бы меня с избытком информации – 60 сообщений для просмотра ( LIMIT 20 ) * 3 – и заставлять меня каждый раз забивать некоторый тип дополнительной сортировки.

Какой вариант лучше / какие-то альтернативные идеи?

Благодарю.

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

Когда вы выполняете один большой запрос с UNION s, MySQL все равно будет выполнять три отдельных запроса, как вы предлагаете сделать в своем альтернативном плане, а затем объединить их в один результат.

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

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

Все зависит от того, насколько велики ваши таблицы. Если каждая таблица содержит несколько тысяч записей, вы можете пойти с первым решением (UNION), и все будет в порядке.

На больших таблицах я, вероятно, поеду со вторым решением, главным образом потому, что он будет использовать гораздо меньше ресурсов (RAM), чем путь UNION, и по-прежнему будет достаточно быстрым.

Но я бы посоветовал вам подумать о своей модели данных и, возможно, оптимизировать ее. Тот факт, что вы должны использовать запросы на основе UNION, обычно означает, что есть место для оптимизации, как правило, путем слияния трех таблиц с добавленным полем «тип» (имена не очень хороши, но вы видите мою точку зрения).

если вы знаете свои ограничения, вы можете ограничить каждый запрос и объединиться только с небольшими данными. это должно быть лучше, поскольку mysql вернет только 20 строк и сделает сортировку быстрее, чем вы можете в php …

 select * from ( SELECT uid, date, currency, 0, 0, 0 from table_a order by date desc limit 20 union SELECT uid, date, 0, type, 0, 0 from table_b order by date desc limit 20 ... ) order by date desc limit 20