SQLite3 как использовать индексы?
Я работаю над индексами SQLite3.
Вот таблица COMAPNY:
CREATE TABLE COMPANY(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL
);
INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (1, 'Paul', 32, 'California', 20000.00 );
INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (2, 'Allen', 25, 'Texas', 15000.00 );
INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (3, 'Teddy', 23, 'Norway', 20000.00 );
INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (4, 'Mark', 25, 'Rich-Mond ', 65000.00 );
INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (5, 'David', 27, 'Texas', 85000.00 );
INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (6, 'Kim', 22, 'South-Hall', 45000.00 );
INSERT INTO COMPANY VALUES (7, 'James', 24, 'Houston', 10000.00 );
=======================================================
SELECT * FROM COMPANY;
результаты:
1|Paul|32|California|20000.0
2|Allen|25|Texas|15000.0
3|Teddy|23|Norway|20000.0
4|Mark|25|Rich-Mond |65000.0
5|David|27|Texas|85000.0
6|Kim|22|South-Hall|45000.0
7|James|24|Houston|10000.0
давайте создадим индекс salary_index,
CREATE INDEX IF NOT EXISTS salary_index on COMPANY (SALARY);
что он делает и как им пользоваться?
на этот раз я делаю такой индекс после падения старшего:
CREATE INDEX IF NOT EXISTS salary_index on COMPANY (SALARY)
WHERE SALARY > 50000;
после того, как я добавил индекс, Я сделал:
SELECT * FROM COMPANY;
ожидая, что я увижу только тех, у кого зарплата выше 50000, но я видел людей ниже этого.
и я также попытался сделать это:
SELECT * FROM COMPANY INDEXED BY salary_index;
затем я получаю ошибку: нет решения запроса Видимо, я должен это сделать.: Выберите * из компании, индексированной salary_index, где зарплата > 50000; Где условие должно быть таким же, как в индексе.
Итак... как использовать индексы?
2 ответов
индексы никогда не изменяют значения ваших запросов. Что они могут сделать, это ускорить некоторые из ваших запросов, когда это возможно, они используются автоматически.
индекс полезен для
-
поиск записей со сравнениями в индексированном столбце:
SELECT * FROM Company WHERE Salary = 20000.0; SELECT * FROM Company WHERE Salary BETWEEN 40000 AND 80000;
который также включает соединения в индексированном столбце; и
-
сортировка записей:
SELECT * FROM Company ORDER BY Salary
который также включает в себя GROUP BY и ОТЧЕТЛИВЫЙ.
см. документацию для подробностей:
Запрос Планирования
Планировщик Запросов SQLite
вот разговор, который у меня был с одним из моих мастеров кода (спасибо S. P.):
индекс обычно является инструментом для производительности. Если у вас нет индекса для поля, запросы к этому полю должны будут выполнить полное последовательное сканирование таблицы. Это не проблема, если таблица мала, но если у вас есть десятки тысяч или выше строк, то полное последовательное сканирование просто слишком медленно.
поэтому, если вы хотите получить строки, для которых зарплата
SELECT * FROM COMPANY WHERE SALARY < 50000
он будет автоматически использовать правильные indexas, пока поле зарплаты индексируется
Итак, если у нас есть два индекса, такие как
CREATE INDEX salary_index WHERE salary < 50000;
CREATE INDEX age_index WHERE age < 40;
и затем мы запускаем запрос, как
SELECT * FROM COMPANY WHERE salary < 50000 AND age < 40;
tt автоматически использует вышеуказанные 2 индекса для запроса.
в большинстве RDBMSs можно использовать более одного индекса в одном запросе, и да, они используются автоматически, если они применяются. Но может быть ... ограничения на это, и они специфичны для RBDMS. Но лучше всего создать индекс, содержащий несколько полей.
в оптимальной ситуации у вас будут все поля, необходимые для запроса в одном индексе Так что если вы хотите, чтобы сотрудники, которые зарабатывают более 50 000 $ и моложе 40 лет вы бы определили такой индекс:
CREATE INDEX company_salary_age ON company (salary, age);
порядок вопросов поля. Этот индекс можно использовать в запросе, содержащем предложение WHERE о зарплате или зарплате и возрасте, но не возраст без зарплаты. То есть любое количество полей индекса может использоваться, если они смежны в передней части индекса, то есть в запросе вы можете опустить поля с конца, но не в начале или середине.