Индексы в mysql

14
Индексы в MySQL используй эффективно ты

Upload: pavel-zyukin

Post on 12-Apr-2017

101 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Индексы в MySQL

Индексы в MySQL используй эффективно ты

Page 2: Индексы в MySQL

Все знают для чего нужны индексы

• поиск информации • сортировка

• группировка• аггрегирующие функции

2

Page 3: Индексы в MySQL

Как работает поиск по индексуна примере B+Tree

3

Page 4: Индексы в MySQL

Что умеет B+Tree индекс?

Числа Строки

• Равенство• Диапазоны

• Сравнение строк (AAA < AAB)

• LIKE 'ABC%'

4

Page 5: Индексы в MySQL

А давайте просто создадим всевозможныеиндексы в каждую таблицу?

• Занимает место на диске, база данных становится толще, меньше данных влезает в память

• MySQL Query Optimizer будет дольше анализировать среди большего количества индексов

• Hint: если есть возможность расширить индекс вместо того, чтобы создать новый - расширяйте!

5

Page 6: Индексы в MySQL

Равенство

• NAME = 'Егор'

KEY(NAME)

• NAME = 'Роман' AND LAST_NAME = 'Жуков'

KEY(NAME,LAST_NAME) KEY(LAST_NAME,NAME)

6

Page 7: Индексы в MySQL

Равенство+ДиапазоныKEY(A,B,C)

Используется полностью:• A > 5• A = 5 AND B > 6• A = 5 AND B = 6 AND C > 7• A = 5 AND B IN(2,3) AND C > 7

Используется частично:• A > 5 AND B = 2 (используется только A)• A = 5 AND B > 6 AND C = 2 (используется только A и B)

Не используется:• B > 5• B = 6 AND C = 7

7

Page 8: Индексы в MySQL

Сортировка

• SELECT * FROM `user` ORDER BY email KEY(email)

• SELECT * FROM `user` WHERE first_name = 'Барак' ORDER BY email KEY(first_name, email)

8

Page 9: Индексы в MySQL

СортировкаKEY(A,B)

Используется для сортировки:• ORDER BY A• A = 5 ORDER BY B• ORDER BY A DESC, B DESC• A > 5 ORDER BY A

Не используется для сортировки:• ORDER BY B• A > 5 ORDER BY B• A IN(1,2) ORDER BY B• ORDER BY A ASC, B DESC

9

Page 10: Индексы в MySQL

Покрывающие индексыПозволяет читать напрямую из индекса

SELECT id FROM `user` WHERE first_name = 'Егор'KEY (first_name, id)

Откуда профит?• индекс меньше по размеру• данные кластеризируются, поэтому ищемпо меньшему числу страниц

10

Page 11: Индексы в MySQL

JOIN в запросеSELECT * FROM `user` WHERE first_name = 'Барак' AND `user`.id = `user_admin`.id

Обязательно должен быть индекс по `user_admin`.id

PREFIX индексыALTER TABLE product ADD INDEX(name(10))

• для TEXT/BLOB• нельзя использовать в качестве покрывающего индекса

11

Page 12: Индексы в MySQL

Немного слов об ICP- А что это такое?- ICP - это Index Condition Pushdown

SELECT * FROM peopleWHERE zipcode = '95054'AND lastname LIKE '%etrunia%'AND address LIKE '%Main Street%'KEY(zipcode, lastname, firstname)

без ICP fullscan начнётся отсюда

с ICP fullscan начнётся отсюда

Доступно начиная с

12

Page 13: Индексы в MySQL

А теперь магия!SELECT * FROM `user` WHERE phone = 911 and email = '@' KEY(phone, sex, email)

Ускоряем запрос:SELECT * FROM `user` WHERE phone = 911 AND sex IN (1,2) AND email = '@'

SELECT * FROM `user` WHERE id IN(1,2) ORDER BY first_nameKEY(id, first_name)

Ускоряем запрос:SELECT * FROM `user` WHERE id = 1UNION ALLSELECT * FROM `user` WHERE id = 2ORDER BY first_name

13

Page 14: Индексы в MySQL