какой из них быстрее / лучше практика sql? - PullRequest
2 голосов
/ 25 марта 2010

Предположим, у меня есть таблица из 2 столбцов (id, flag) и id является последовательным. Я ожидаю, что эта таблица будет содержать много записей. Я хочу периодически выбирать первую строку без пометки и обновлять ее. Возможно, некоторые записи в пути уже помечены, поэтому я хочу их пропустить.

Имеет ли смысл сохранять последний помеченный идентификатор и использовать его в своем операторе выбора, например

select * from mytable where id > my_last_id order by id asc limit 1

или просто получить первую непомеченную строку, например:

select * from mytable where flagged = 'F' order by id asc limit 1

Спасибо!

Ответы [ 4 ]

3 голосов
/ 25 марта 2010

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

2 голосов
/ 25 марта 2010

Второй вариант - единственный, который имеет смысл, если только вы не знаете, что всегда будете обрабатывать записи последовательно!

0 голосов
/ 25 марта 2010

Вы можете использовать

Select Min(Id) as 'Id'
From dbo.myTable
Where Flagged='F'

Предполагая, что Flagged = 'F' означает, что он не помечен.

0 голосов
/ 25 марта 2010

Предполагая MySQL, это:

SELECT  *
FROM    mytable
WHERE   flagged = 'F'
ORDER BY
        flagged ASC, id ASC
LIMIT 1

будет немного менее эффективным в InnoDB и такой же эффективностью в MyISAM, если у вас есть индекс для (flagged, id).

InnoDB таблицы сгруппированы в PRIMARY KEY, поэтому выбор первой записи в id не требует поиска таблицы.

В MyISAM таблицы организованы в кучу, поэтому индекс, используемый для контроля PRIMARY KEY, хранится отдельно от таблицы.

Обратите внимание, что flagged в предложении ORDER BY может показаться излишним, но требуется MySQL для выбора правильного индекса.

Кроме того, составной индекс должен быть на (flagged, id) даже в InnoDB (что подразумевает включение PRIMARY KEY в каждый индекс).

...