Индексы в mysql
TRANSCRIPT
Индексы в MySQL используй эффективно ты
Все знают для чего нужны индексы
• поиск информации • сортировка
• группировка• аггрегирующие функции
2
Как работает поиск по индексуна примере B+Tree
3
Что умеет B+Tree индекс?
Числа Строки
• Равенство• Диапазоны
• Сравнение строк (AAA < AAB)
• LIKE 'ABC%'
4
А давайте просто создадим всевозможныеиндексы в каждую таблицу?
• Занимает место на диске, база данных становится толще, меньше данных влезает в память
• MySQL Query Optimizer будет дольше анализировать среди большего количества индексов
• Hint: если есть возможность расширить индекс вместо того, чтобы создать новый - расширяйте!
5
Равенство
• NAME = 'Егор'
KEY(NAME)
• NAME = 'Роман' AND LAST_NAME = 'Жуков'
KEY(NAME,LAST_NAME) KEY(LAST_NAME,NAME)
6
Равенство+Диапазоны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
Сортировка
• SELECT * FROM `user` ORDER BY email KEY(email)
• SELECT * FROM `user` WHERE first_name = 'Барак' ORDER BY email KEY(first_name, email)
8
Сортировка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
Покрывающие индексыПозволяет читать напрямую из индекса
SELECT id FROM `user` WHERE first_name = 'Егор'KEY (first_name, id)
Откуда профит?• индекс меньше по размеру• данные кластеризируются, поэтому ищемпо меньшему числу страниц
10
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
Немного слов об 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
А теперь магия!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