2017-01-20 16 views
1

Каков самый быстрый способ проверить, существует ли запись, когда я знаю первичный ключ? select, count, filter, where или что-то еще?Самый быстрый способ проверки наличия записи

+0

'COUNT (ID) из таблицы, где table.id =«КЛЮЧ»', вероятно, является идеальным, поскольку он воспользуется любой частичной способностью поиска (особенно быстро в столбчатых базах данных, как красное смещение Амазонка) и индексация первичного ключа. – TemporalWolf

+0

Самый быстрый способ - использовать count среди указанных опций. Чтобы быть более сырыми, используйте sqlite3_column_count() непосредственно из источников sqlite, поддерживая пользовательский хеш-список. – Jerry

ответ

1

Вы можете проверить себя через EXPLAIN QUERY PLAN, который расскажет вам о стоимости &, которую он намерен выполнить для конкретного запроса.

Затраты не сравниваются напрямую между прогонами, но вы должны получить достойное представление о наличии каких-либо существенных отличий.

Это, как ожидается, будет COUNT(id) FROM table WHERE table.id="KEY", вероятно, идеальным, так как он воспользуется любой частичной способностью поиска (особенно быстро в columnar databases, например, красным смещением amazon) и индексированием первичного ключа.

1

Когда вы используете count, база данных должна продолжить поиск, даже если она обнаружила запись, потому что может существовать вторая. Итак, вы должны найти фактическую запись и сообщить базе данных, чтобы она остановилась после первого.

Когда вы запрашиваете возврат данных из записи, база данных должна считывать данные из таблицы. Но если запись можно найти, просмотрев идентификатор в индексе, доступ к этой таблице будет лишним. Таким образом, вы не должны возвращать ничего, кроме ID, который вы используете для поиска:

SELECT id FROM MyTable WHERE id = ? LIMIT 1; 

Во всяком случае, не читает фактические данные и ограничения подразумеваются при использовании EXISTS, который проще в PeeWee:

SELECT EXISTS (SELECT * FROM MyTable WHERE id = ?); 
MyTable.select().where(MyTable.id == x).exists() 

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

  • Нет связанных вопросов^_^