Почему первый запрос быстрее второго? - PullRequest
0 голосов
/ 28 февраля 2012

Извините, что проясняю мои вопросы. Расширение этого вопроса Оптимизация sqlite запроса

У меня есть таблица:

CREATE TABLE IF NOT EXISTS [app_status](
[id] INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL ,
[status] TEXT DEFAULT NULL,
[type] INTEGER
)  

У меня есть два индекса. Один на status, а другой на type. Какой запрос будет выполняться быстрее и почему?

SELECT COALESCE(min(type), 0)
  FROM app_status
 WHERE status IS NOT NULL
   AND type IN (1,2) limit 1

ПЛАН ЗАПРОСА o / p

0|0|0|SEARCH TABLE app_status USING INDEX idx_type (mailbox_type=?) (~10 rows)
0|0|0|EXECUTE LIST SUBQUERY 1

Или ...

SELECT type FROM
app_status WHERE
status IS NOT NULL
ORDER BY type limit 1

ПЛАН ЗАПРОСА o / p

0|0|0|SCAN TABLE app_status USING INDEX idx_type (~500000 rows)

Ответы [ 2 ]

2 голосов
/ 28 февраля 2012

Вы должны:

CREATE INDEX idx_app_staus ON app_status (status, type)

Таким образом, ангел базы данных не должен будет искать все строки, он может найти точные строки, в которых он нуждается в предложении where.Я не знаю, какой запрос быстрее, потому что они не возвращают тот же набор результатов, но с индексом сверху все эти типы запросов будут быстрыми.Два других индекса могут быть отброшены.

2 голосов
/ 28 февраля 2012

Первый запрос возвращает ноль или одну строку, соответствующие критериям в предложении 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 строк. Как вы думаете, что может быть быстрее?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...