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