У меня есть две таблицы в моей базе данных sqlite t1 и t2. t1 имеет два столбца a и b. t2 имеет один столбец, такой же, как в t1. Я построил индексы для каждого столбца в обеих таблицах. Я хочу выбрать все строки из таблицы t1, где t1.a существует в таблице t2. Итак, я написал запрос:
select t1.a, t1.b from t1 where t1.a in(select t2.a from t2) limit 10000000;
Я использую ограничение для выбора всех строк, а не первых 100.
Таблица t1 содержит 6000000 строк, таблица t2 100000 строк . Этот запрос выполняет 1400 мс.
Но когда я пытаюсь выбрать только t1.a с помощью этого запроса:
select t1.a from t1 where t1.a in(select t2.a from t2) limit 10000000;
, он занимает всего 86 мс.
Объясните план запроса:
SEARCH TABLE csv USING COVERING INDEX iin_idx (iin=?)
USING INDEX sqlite_autoindex_input_1 FOR IN-OPERATOR
Вопросы:
- Почему sqlite так себя ведет?
- Какая разница в выборе одного столбца или нескольких?
- Это возможно ли ускорить этот запрос?
- Почему sqlite использует автоиндекс вместо созданного?
Я хочу заполнить таблицу t1 155 000 000 строк, поэтому время запроса будет расти значительно.