Первый запрос возвращает ноль или одну строку, соответствующие критериям в предложении WHERE (where status is not null and type in (1,2)
, в неуказанном порядке.
Второй запрос находит все строки, соответствующие критериям в предложении WHERE (where status is not null
), сортирует их по типу и затем возвращает ноль или 1 строку.
Следует отметить, что два запроса, в то время как они могут возвращать идентичные результаты, не гарантированы. В частности, строка, возвращаемая вторым запросом, будет возвращать первую строку набора результатов в порядке, указанном type
, независимо от того, какое значение имеет type
. Если самое низкое значение для type
, где `состояние не равно нулю, скажем 157, это строка, которую вы собираетесь получить. Первый запрос в этом случае вернет 0 строк.
Но если предположить, что type
и status
проиндексированы и запрос может использовать один или несколько индексов, то я подозреваю, что первый запрос будет быстрее, поскольку он может искать непосредственно в нужной строке (строках).
Но многое зависит от формы данных (сколько данных там? Как они распределяются? И т. Д.), «Покрывает» ли индекс (если индекс не охватывает все столбцы в запрос, то он должен выполнить дополнительные операции ввода-вывода, чтобы получить данные страницы, необходимые для охвата всех столбцов.
отредактировано в примечании Глядя на опубликованные вами планы выполнения (не зная Sqllite), первый план говорит, что он должен вернуть около 10 строк; вторая около 50000 строк. Как вы думаете, что может быть быстрее?