Если вы просто хотите знать, если любых строк изменились, следующий запрос, вероятно, быстрее, чем любой из ваших:
SELECT id FROM xxx WHERE changed > some_timestamp LIMIT 1
Просто для полноты картины: Убедитесь, что у вас есть индекс по changed
.
Edit: Небольшое увеличение производительности
Теперь, когда я думаю об этом, вероятно, вы должны сделать SELECT change
вместо selecing в id
, потому что исключает доступ к таблице на всех. Этот запрос скажет вам довольно быстро, если какие-либо изменения были выполнены.
SELECT changed FROM xxx WHERE changed > some_timestamp LIMIT 1
Он должен быть чуть-чуть быстрее, чем мой первый запрос - не много, хотя, так как доступ к одной строке таблицы будет очень быстро.
Следует ли вместо этого выбрать MAX(changed)
?
Выбор MAX(changed)
, как предлагает Federico, должен в значительной степени привести к тому же шаблону доступа к индексу. Поиск наивысшего элемента в индексе - очень дешевая операция. Поиск любого элемента, который больше некоторой константы, потенциально дешевле, так что оба должны иметь примерно такую же производительность. В любом случае оба запроса чрезвычайно быстрые даже на очень больших таблицах, если - и только если - есть индекс.
Должен ли я сначала проверить, были ли изменены какие-либо строки, а затем получить строки в отдельном шаге
No. Если нет строки, которая изменилась, SELECT id FROM xxx WHERE changed > some_timestamp
будет так быстро, как любой такой сделав его бессмысленным для его выполнения отдельно. Это приводит к более медленной работе, когда есть результаты. Если вы не добавляете дорогостоящие операции (например, ORDER BY
), производительность должна быть (почти) линейной по количеству извлеченных строк.
эй, спасибо за ответ, можете ли вы проверить мой EDIT и посмотреть, действительно ли это действует? – glesage