2013-04-24 2 views
0

Я пытаюсь проверить, были ли какие-либо строки обновлены с момента последнего проверки. Я хотел бы знать, если есть какие-либо лучшие альтернативыЛучший способ проверить обновленные строки в MySQL

"SELECT id FROM xxx WHERE changed > some_timestamp;" 

Однако, так как есть 200,000+ строки он может получить тяжелые довольно быстро ... будет подсчетом быть лучше?

"SELECT count(*) FROM xxx WHERE changed > some_timestamp;" 

Я думал о создании модульного теста, но я не лучший в этом еще /:

Спасибо за помощь!


EDIT: Потому что во многих случаях не будет никаких строк, которые изменились, было бы лучше, чтобы всегда проверить с MAX (хх) во-первых, и, если его больше, чем старое обновление Отметка времени задано, то сделать запрос?

ответ

1

Если вы просто хотите знать, если любых строк изменились, следующий запрос, вероятно, быстрее, чем любой из ваших:

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), производительность должна быть (почти) линейной по количеству извлеченных строк.

+0

эй, спасибо за ответ, можете ли вы проверить мой EDIT и посмотреть, действительно ли это действует? – glesage

1

Сделать индекс по some_timestamp и запуск:

SELECT MAX(some_timestamp) FROM xxx; 

Если таблица MyISAM, запрос будет немедленно.

+0

эй, спасибо за ответ, можете ли вы проверить мой EDIT и посмотреть, сохранилось ли это? – glesage

+0

Привет! Если вы используете MyISAM, поиск максимального/минимального значения индекса всегда является самой дешевой операцией. В случае InnoDB ... Я уверен, что нет заметной разницы, но эквивалент MAX - это не то, что вы написали, это: SELECT val FROM tab ORDER BY val DESC LIMIT 1 –

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