Индексы в 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 people
WHERE 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_name
KEY(id, first_name)
Ускоряем запрос:
SELECT * FROM `user` WHERE id = 1
UNION ALL
SELECT * FROM `user` WHERE id = 2
ORDER BY first_name
13
Индексы в MySQL

Индексы в MySQL

  • 1.
    Индексы в MySQLиспользуй эффективно ты
  • 2.
    Все знают длячего нужны индексы •поиск информации •сортировка •группировка •аггрегирующие функции 2
  • 3.
    Как работает поискпо индексу на примере B+Tree 3
  • 4.
    Что умеет B+Treeиндекс? Числа Строки •Равенство •Диапазоны •Сравнение строк (AAA < AAB) •LIKE 'ABC%' 4
  • 5.
    А давайте простосоздадим всевозможные индексы в каждую таблицу? • Занимает место на диске, база данных становится толще, меньше данных влезает в память • MySQL Query Optimizer будет дольше анализировать среди большего количества индексов • Hint: если есть возможность расширить индекс вместо того, чтобы создать новый - расширяйте! 5
  • 6.
    Равенство • NAME ='Егор' KEY(NAME) • NAME = 'Роман' AND LAST_NAME = 'Жуков' KEY(NAME,LAST_NAME) KEY(LAST_NAME,NAME) 6
  • 7.
    Равенство+Диапазоны 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
  • 8.
    Сортировка • SELECT *FROM `user` ORDER BY email KEY(email) • SELECT * FROM `user` WHERE first_name = 'Барак' ORDER BY email KEY(first_name, email) 8
  • 9.
    Сортировка KEY(A,B) Используется для сортировки: •ORDERBY 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
  • 10.
    Покрывающие индексы Позволяет читатьнапрямую из индекса SELECT id FROM `user` WHERE first_name = 'Егор' KEY (first_name, id) Откуда профит? •индекс меньше по размеру •данные кластеризируются, поэтому ищем по меньшему числу страниц 10
  • 11.
    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
  • 12.
    Немного слов обICP - А что это такое? - ICP - это Index Condition Pushdown SELECT * FROM people WHERE zipcode = '95054' AND lastname LIKE '%etrunia%' AND address LIKE '%Main Street%' KEY(zipcode, lastname, firstname) без ICP fullscan начнётся отсюда с ICP fullscan начнётся отсюда Доступно начиная с 12
  • 13.
    А теперь магия! 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_name KEY(id, first_name) Ускоряем запрос: SELECT * FROM `user` WHERE id = 1 UNION ALL SELECT * FROM `user` WHERE id = 2 ORDER BY first_name 13