У меня три таблицы, каждая из которых содержит некоторую общую информацию и некоторую информацию, которая уникальна для таблицы. Например: uid
, date
является универсальной среди таблиц, но одна таблица может содержать type
столбца, а другая – currency
. Мне нужно запросить базу данных и получить последние 20 записей ( date DESC
), которые были введены во всех трех таблицах. Мои параметры:
Запросите базу данных один раз, с одним большим запросом, содержащим три предложения UNION ALL
и передайте поддельные значения для столбцов, IE:
FROM ( SELECT uid, date, currency, 0, 0, 0
и позже
FROM ( SELECT uid, date, 0, type, 0, 0
Это оставило бы меня с выделенными нулевыми полями.
ИЛИ я могу запросить базу данных три раза, и как-то в 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