Качаем ловкость MySQL

25
#backendmeetup Качаем ловкость MySQL Sergey White VEZETVSEM

Transcript of Качаем ловкость MySQL

Page 1: Качаем ловкость MySQL

#backendmeetup

Качаем ловкость

MySQL

Sergey WhiteVEZETVSEM

Page 2: Качаем ловкость MySQL

MySQL vs PL/SQL ORACLE in me...● Отладчик● Использование hints● Шикарный оптимизатор SQL, PL/SQL кода● Использование JOB’S● Восстановление данных из временных логических таблиц● Сама архитектура Oracle● Миллион и маленькая тележка функций, процедур● Привычный ООП подход к написанию кода.

VEZETVSEM

Page 3: Качаем ловкость MySQL

О чём поговорим:

● Индексы MySQL● Совет по написанию SQL кода в MySQL.● SQL Tricks or how to make index● Как используются индексы в 90% случаях

VEZETVSEM

Page 4: Качаем ловкость MySQL

Индексы

● BTREE● RTREE● Hash Index● FullText MyISAM, InnoDB from 5.6

VEZETVSEM

Page 5: Качаем ловкость MySQL

MyISAM vs InnoDB

● Кластер: Нет● Блокировка на уровне таблицы WTF?!?!● Полнотекстовый поиск: ДА● Внешние ключи: НЕТ● Все индексы одинаковы

● Кластер: ДА● Блокировка на уровне row● Полнотекстовый поиск: НЕТ● Внешние ключи: ДА● Pimary key - особенный

MyISAM InnoDB

VEZETVSEM

Page 6: Качаем ловкость MySQL

Добби InnoDB for BTREE indexes● Find all rows with key = 5(point lookup)● Find all rows with key > 5(open range)● Find all rows with 5 < key < 10(close range)● Not find rows with last digit of the key is Zero

VEZETVSEM

Page 7: Качаем ловкость MySQL

Strings

● “AAAA” < “AAAB”

● LIKE “ABC%” =

ABC[low] < key < ABC[high]

● LIKE “%ABC”

VEZETVSEM

Page 8: Качаем ловкость MySQL

Для чего MySQL использует index● Поиск● Сортировка● Избежание повторного чтения данных

VEZETVSEM

Page 9: Качаем ловкость MySQL

Search

● Select * from EMPLOYES WHERE LAST_NAME = “IVANOV”

key(LAST_NAME)

● Select * from EMPLOYES WHERE LAST_NAME = “IVANOV” AND

DEPT = “DEV”

key(LAST_NAME,DEPT)

VEZETVSEM

Page 10: Качаем ловкость MySQL

Multiple Index tricks● Index(A,B,C) порядок имеет значение● Полное использование индекса

○ A = 5○ A = 5 AND B > 5○ A = 5 AND B =6 AND C = 7○ A = 5 AND B in (3,4) AND C > 7

● Не будет использоваться индекс○ B > 6○ B = 6 AND C > 7

● Используется только часть индекса○ A > 5 AND B = 6○ A = 5 AND B > 6 AND C = 7

VEZETVSEM

Page 11: Качаем ловкость MySQL

Основное правило1. Уважай первую колонку2. Остерегайся range…..

VEZETVSEM

Page 12: Качаем ловкость MySQL

Сортировка1. SELECT * FROM PLAYERS ORDER BY SCORES DESC LIMIT 10

Индексов нет, получим (filesort)

2. SELECT * FROM PLAYERS WHERE COUNTRY=”RUS” ORDER BY

SCORE DESC

key(COUNTRY, SCORE)

VEZETVSEM

Page 13: Качаем ловкость MySQL

Заставим делать сортировку в index’e● key(A,B)● Index работает:

○ ORDER BY A○ A = 5 ORDER BY B○ ORDER BY A DESC, ORDER BY B DESC○ A > 5 ORDER BY A

● Index не работает○ ORDER BY B○ A > 5 ORDER BY B○ A in (1,2) ORDER BY B○ ORDER BY A ASC, B DESC (Trick ORDER BY A ASC, -B ASC)

VEZETVSEM

Page 14: Качаем ловкость MySQL

Коротко о сортировке

VEZETVSEM

Page 15: Качаем ловкость MySQL

Читать данные с диска не эффективноSELECT STATUS FROM ORDERS WHERE CUSTOMER_ID = 123

index(CUSTOMER_ID,STATUS)

VEZETVSEM

Page 16: Качаем ловкость MySQL

GROUP BY● SELECT MAX(ID) FROM table● SELECT DEPT_ID, MAX(SALARY) FROM employee GROUP BY DEPT_ID

Необходим индекс(DEPT_ID,SALARY)

Основная радость Using Index for group by

VEZETVSEM

Page 17: Качаем ловкость MySQL

Index and JOINS

GOOD

SELECT * FROM USERS u

JOIN USER_PROFILE up

ON u.user_profile_id = up.id

WHERE u.role_id = 3

BAD

SELECT * FROM USERS u

JOIN USER_PROFILE up

ON u.id = up.user_id

WHERE u.role_id = 3

Нужен key(user_id)

VEZETVSEM

Page 18: Качаем ловкость MySQL

MERGE_INDEX● Select * from tabl1 WHERE A= 1 AND B = 3 key(a), key(b).

● Select * from tabl1 WHERE A =1 OR B = 3 (коварный fullscan)

VEZETVSEM

Page 19: Качаем ловкость MySQL

Explain● Средствами IDE, некоторые замечательно строят граф● EXPLAIN● EXPLAIN JSON● https://dev.mysql.com/doc/refman/5.7/en/explain-output.html

VEZETVSEM

Page 20: Качаем ловкость MySQL

Стратегия выбора Index’ов● Data and MUST NOW 100 SQL STATEMENTS ● Where● Exceptions(Hints)

VEZETVSEM

Page 21: Качаем ловкость MySQL

Пример стратегии индексирования.

● Select * from table where a > 5 and b = 3 ● Select * from table where a = 5 and b = 5

VEZETVSEM

Page 22: Качаем ловкость MySQL

Trick 1Есть ключ (A,B)SELECT * FROM table1 WHERE a BETWEEN 1 AND 4 AND b = 3

что можем сделать

SELECT * FROM table1 WHERE a in (1,2,3,4) AND b = 3

VEZETVSEM

Page 23: Качаем ловкость MySQL

Trick 2key(CITY,GENDER)

SELECT * FROM PEOPLE WHERE CITY = “ROSTOV”

Индекс будет использоваться, но не максимально эффективно. Для того чтобы выжать максимум из индекса, что стоит сделать:

SELECT * FROM PEOPLE WHERE CITY = “ROSTOV” AND GENDER IN (“M”,”F”)

VEZETVSEM

Page 24: Качаем ловкость MySQL

Trick 3...ужастный Filesortkey(A,B)

SELECT * FROM TABLE1 WHERE a in (1,2) ORDER BY b LIMIT 10;

SELECT * FROM (SELECT * FROM TABLE1 WHERE a =1 limit 10UNION ALL SELECT * FROM TABLE1 WHERE a =2 limit 10

) ORDER BY B.

VEZETVSEM

Page 25: Качаем ловкость MySQL

Доступен

● https://www.facebook.com/sergey.white.77● [email protected][email protected]

VEZETVSEM