2016-01-07 2 views
1

У меня есть sqlite db сотрудников с около миллиона записей.SQLITE: Как сделать работу индексации для вас?

company: 

emp_id(primary) | first_name | last_name | company_name | job_title 

БД содержит только 10 различных названий компаний (то есть, скажем, каждая компания имеет около 100к сотрудников) Я создал индекс по названию компании:

CREATE INDEX cmp_name ON company(company_name) 

Но я не получил какой-либо скорости при выполнения запроса:

с индексом:

select * from company INDEXED BY cmp_name where company_name = 'XYZ corp'; 
Time: 88.45 sec 

Вт ITHOUT INDEX:

select * from company where company_name = 'XYZ corp'; 
Time: 89.12 sec 

Что я делаю неправильно?

+0

Вы по-прежнему выбираете 100 000 строк, индекс не сделает эту часть быстрее магически. Вы видите разницу для 'select count (*)'? – Thilo

+0

@Thilo Как я могу изменить свой индекс, чтобы получить скорость? – theLearner

+0

Итак, вы работаете в организации с 1 миллионом сотрудников, но вы застряли с использованием sqlite в качестве реляционного db? Не сервер oracle, postgresql или sql? –

ответ

3

База данных организована на страницы. Если более десяти строк вписываются в страницу, то, в среднем, чтение всех строк «XYZ Corp» по-прежнему требует чтения большинства страниц. Кроме того, если записи индекса не имеют того же порядка, что и строки таблицы, страница таблицы больше не читается в порядке.

Единственный способ ускорить этот запрос - использовать covering index. Во-первых, уменьшить количество столбцов прочитанных к абсолютному минимуму, что вы на самом деле нужно, а затем добавить все эти столбцы индекса название компании (столбец INTEGER PRIMARY KEY неявно часть каждого индекса):

CREATE INDEX cmp_name_and_other_stuff ON company(company_name, last_name); 

SELECT emp_id, last_name FROM company WHERE company_name = 'XYZ Corp'; 

Выполнение этого для каждого запроса будет много места для хранения.

+0

Означает ли это, если я хочу создать поисковый запрос для 5 столбцов, я должен создать индекс со всеми этими 5 столбцами? – theLearner

+1

Нет. Индекс с одним столбцом, который уменьшает количество прочитанных табличных страниц, отлично работает. Кроме того, индекс может использоваться только в том случае, если поиск выполняется во всех его левых столбцах. –

+0

Но я не понимаю, что вы сказали: чтение названия компании по-прежнему потребует чтения большинства страниц. Но если я проиндексировал db на основе названия компании, не читайте только 1/10 страницы, то есть только индексированные страницы, индексированные корпорацией XYZ? – theLearner

Смежные вопросы