SlideShare ist ein Scribd-Unternehmen logo
1 von 23
Downloaden Sie, um offline zu lesen
Оптимизатор запросов
в MariaDB 10.0 —
теперь и без индексов!
Сергей Голубчик
MariaDB
Об этом докладе
●

Engine Independent Statistics

●

Что это такое

●

Зачем это нужно

●

Как считается

●

Где хранится

●

Примеры, примеры, примеры
Статистика данных: как это было
●

Оптимизатор спрашивает движок:
●

«сколько примерно строк в таблице?»

●

«сколько стоит просканировать всю таблицу?»

●

«сколько стоит прочитать столько-то строк из такого-то индекса?»

●

●

«сколько раз в среднем каждое значение встречается в таком-то
индексе?»

«сколько значений в таком-то индексе попадает в диапазон от… и
до…?»
Пример: нестабильность
●

DBT-3: сложные аналитические запросы
●

Q7: Volume Shipping Query

●

6 InnoDB таблиц
– 7 разных планов
– 12 минут, 25 минут, часы (таймаут)
Q8: National Market Share Query
–

–
–
–

8 InnoDB таблиц
4 разных плана
от 7 минут до 1.2 часа
Пример: неправда
MariaDB [test]> CREATE TABLE t1 (a INT, b INT, c INT, KEY(a,b)) ENGINE=MyISAM;
MariaDB [test]> INSERT t1 VALUES (RAND()*1e5,RAND()*1e5,RAND()*1e5);
... 400 000 rows ...
MariaDB [test]> SELECT COUNT(DISTINCT a) AS cardinality FROM t1;
+-------------+
| cardinality |
+-------------+
|
97794 |
+-------------+
MariaDB [test]> SELECT cardinality FROM information_schema.statistics
--> WHERE table_name='t1' AND column_name='a';
+-------------+
| cardinality |
+-------------+
|
98304 |
+-------------+
MariaDB [test]> ALTER TABLE t1 ENGINE=InnoDB;
MariaDB [test]> SELECT cardinality FROM information_schema.statistics
--> WHERE table_name='t1' AND column_name='a';
+-------------+
| cardinality |
+-------------+
|
196914 |
+-------------+
Независимая статистика
●

стабильная

●

точная

●

одинаковая для всех движков
Как это сделано
●

новые таблицы в mysql

●

конфигурационные переменные

●

расширенная команда ANALYZE TABLE
Таблицы
●

mysql.table_stats

●

mysql.index_stats

●

mysql.column_stats
Переменные
●

@@use_stat_tables
●
●

complementary

●
●

never
preferably

@@optimizer_use_condition_selectivity
●

1 … 5
Команда ANALYZE TABLE
●

ANALYZE TABLE table_name

●

ANALYZE TABLE table_name PERSISTENT FOR ALL

●

ANALYZE TABLE table_name PERSISTENT FOR
COLUMNS (column1, column2, ...)

INDEXES (index1, index2, ...)
Что считается
●

по таблицам
●

●

количество строк

по индексам
●

обратная мощность
Что считается
●

по столбцам
●

минимальное и максимальное значения

●

процент NULL-ов

●

средняя длина значения

●

обратная мощность

●

распределение значений (гистограмма)
Пример
CREATE TABLE t1 (a INT, b INT);
INSERT t1 SELECT RAND()*1e5, RAND()*1e5;
. . . . . . . . . .
-- 512 тысяч строк
CREATE TABLE t2 (c INT, d INT, KEY(c), KEY(d));
INSERT t2 SELECT FLOOR(RAND()*1e5/2)*2, FLOOR(RAND()*1e5/3)*3 FROM t1;
CREATE TABLE t3 (e INT, f INT, KEY(f));
INSERT t3 SELECT * FROM t2;
ANALYZE TABLE t3;
SET OPTIMIZER_USE_CONDITION_SELECTIVITY=1;
SELECT * FROM t1, t2, t3 WHERE t3.f=t1.a AND t2.c=t1.a AND t3.e<5;
--> 1075 rows in set (1 min 19.25 sec)
SET OPTIMIZER_USE_CONDITION_SELECTIVITY=3;
SELECT * FROM t1, t2, t3 WHERE t3.f=t1.a AND t2.c=t1.a AND t3.e<5;
--> 1075 rows in set (13.17 sec)
Пример
MariaDB [test]> . employees.sql
MariaDB [employees]> ANALYZE TABLE departments, dept_emp, dept_manager,
-> employees, salaries, titles;
MariaDB [employees]> SET OPTIMIZER_USE_CONDITION_SELECTIVITY=1;
Query OK, 0 rows affected (0.01 sec)
MariaDB [employees]> SELECT * FROM departments JOIN dept_emp USING (dept_no)
-> JOIN employees USING (emp_no) JOIN titles USING (emp_no) WHERE title='Manager';
24 rows in set (15.13 sec)
MariaDB [employees]> SET OPTIMIZER_USE_CONDITION_SELECTIVITY=3;
Query OK, 0 rows affected (0.01 sec)
MariaDB [employees]> SELECT * FROM departments JOIN dept_emp USING (dept_no)
-> JOIN employees USING (emp_no) JOIN titles USING (emp_no) WHERE title='Manager';
24 rows in set (0.53 sec)
Пример
MariaDB [employees]> EXPLAIN EXTENDED SELECT * FROM departments JOIN dept_emp USING
(dept_no)
-> JOIN employees USING (emp_no) JOIN titles USING (emp_no) WHERE title='Manager';
+------+-------------+--------+---------+-------+----------+-----------------------+
| id
| table
| type
| key
| rows | filtered | Extra
|
+------+-------------+--------+---------+-------+----------+-----------------------+
|
1 | departments | ALL
| NULL
|
9 |
100.00 |
|
|
1 | dept_emp
| ref
| dept_no | 36844 |
100.00 |
|
|
1 | employees
| eq_ref | PRIMARY |
1 |
100.00 |
|
|
1 | titles
| ref
| PRIMARY |
1 |
100.00 | Using index condition |
+------+-------------+--------+---------+-------+----------+-----------------------+
MariaDB [employees]> SET OPTIMIZER_USE_CONDITION_SELECTIVITY=3;
MariaDB [employees]> EXPLAIN EXTENDED SELECT * FROM departments JOIN dept_emp USING
(dept_no)
-> JOIN employees USING (emp_no) JOIN titles USING (emp_no) WHERE title='Manager';
+------+-------------+--------+---------+--------+----------+-----------------------------| id
| table
| type
| key
| rows
| filtered | Extra
+------+-------------+--------+---------+--------+----------+-----------------------------|
1 | titles
| ALL
| NULL
| 443308 |
14.29 | Using where
|
1 | employees
| eq_ref | PRIMARY |
1 |
100.00 |
|
1 | dept_emp
| ref
| PRIMARY |
1 |
100.00 |
Неравномерное распределение
●

Таблица скачиваний какого-то продукта N

●

Пусть, пользователи могут регистрироваться
–

и, где-то 1% на самом деле это делает
… WHERE Registered = 'YES' …

990 000

YES

1,000,000 rows
среднее количество строк на значение: 500,000

NO

10 000
Registered
Гистограммы
●

histogram_size=20 или любое число больше нуля

●

optimizer_use_condition_selectivity=4 или 5

●

histogram_type=single_prec_hb или double_prec_hb
Гистограммы равной высоты
Пример
MariaDB [employees]> SET OPTIMIZER_USE_CONDITION_SELECTIVITY=3;
Query OK, 0 rows affected (0.00 sec)
MariaDB [employees]> SELECT * FROM employees JOIN salaries
-> USING (emp_no) JOIN titles USING (emp_no) WHERE salary > 100000;
166014 rows in set (18.79 sec)

MariaDB [employees]> SET OPTIMIZER_USE_CONDITION_SELECTIVITY=4;
Query OK, 0 rows affected (0.00 sec)
MariaDB [employees]> SELECT * FROM employees JOIN salaries
-> USING (emp_no) JOIN titles USING (emp_no) WHERE salary > 100000;
166014 rows in set (6.64 sec)
Пример
MariaDB [employees]> EXPLAIN EXTENDED SELECT * FROM employees JOIN salaries
-> USING (emp_no) JOIN titles USING (emp_no) WHERE salary > 100000;
+------+-----------+--------+---------+--------+----------+-------------+
| id
| table
| type
| key
| rows
| filtered | Extra
|
+------+-----------+--------+---------+--------+----------+-------------+
|
1 | titles
| ALL
| NULL
| 443308 |
100.00 |
|
|
1 | employees | eq_ref | PRIMARY |
1 |
100.00 |
|
|
1 | salaries | ref
| PRIMARY |
9 |
48.68 | Using where |
+------+-----------+--------+---------+--------+----------+-------------+
3 rows in set, 1 warning (0.00 sec)
MariaDB [employees]> SET OPTIMIZER_USE_CONDITION_SELECTIVITY=4;
Query OK, 0 rows affected (0.00 sec)
MariaDB [employees]> EXPLAIN EXTENDED SELECT * FROM employees JOIN salaries
-> USING (emp_no) JOIN titles USING (emp_no) WHERE salary > 100000;
+------+-----------+--------+---------+---------+----------+-------------+
| id
| table
| type
| key
| rows
| filtered | Extra
|
+------+-----------+--------+---------+---------+----------+-------------+
|
1 | salaries | ALL
| NULL
| 2844047 |
4.76 | Using where |
|
1 | employees | eq_ref | PRIMARY |
1 |
100.00 |
|
|
1 | titles
| ref
| PRIMARY |
1 |
100.00 |
|
+------+-----------+--------+---------+---------+----------+-------------+
3 rows in set, 1 warning (0.01 sec)
Планы
●

Другие типы гистограмм (например, равной ширины)

●

Гистограммы для индексов (из нескольких столбцов!)

●

Учет корреляций между столбцами
Вопросы?
Спасибо за внимание!

Weitere ähnliche Inhalte

Ähnlich wie Cергей Голубчик, Monty Program AB

СУБД осень 2012 лекция 8
СУБД осень 2012 лекция 8СУБД осень 2012 лекция 8
СУБД осень 2012 лекция 8
Technopark
 
Новые возможности отладки MySQL 5.7 на практике
Новые возможности отладки MySQL 5.7 на практикеНовые возможности отладки MySQL 5.7 на практике
Новые возможности отладки MySQL 5.7 на практике
Sveta Smirnova
 
поиск узких мест в производительности My sql ботанический определитель. г. ру...
поиск узких мест в производительности My sql ботанический определитель. г. ру...поиск узких мест в производительности My sql ботанический определитель. г. ру...
поиск узких мест в производительности My sql ботанический определитель. г. ру...
rit2011
 
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить / Сергей Авер...
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить / Сергей Авер...То, что вы хотели знать о HandlerSocket, но не смогли нагуглить / Сергей Авер...
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить / Сергей Авер...
Ontico
 
лабораторная работа 8
лабораторная работа 8лабораторная работа 8
лабораторная работа 8
student_kai
 
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
Ontico
 
CodeFest 2013. Аверин С. — MySQL+HandlerSocket=NoSQL
CodeFest 2013. Аверин С. — MySQL+HandlerSocket=NoSQLCodeFest 2013. Аверин С. — MySQL+HandlerSocket=NoSQL
CodeFest 2013. Аверин С. — MySQL+HandlerSocket=NoSQL
CodeFest
 
Оптимизации скорости выполнения запросов
Оптимизации скорости выполнения запросовОптимизации скорости выполнения запросов
Оптимизации скорости выполнения запросов
Alex.Kolonitsky
 
Производительность запросов в PostgreSQL - шаг за шагом / Илья Космодемьянски...
Производительность запросов в PostgreSQL - шаг за шагом / Илья Космодемьянски...Производительность запросов в PostgreSQL - шаг за шагом / Илья Космодемьянски...
Производительность запросов в PostgreSQL - шаг за шагом / Илья Космодемьянски...
Ontico
 
Промышленный подход к тюнингу PostgreSQL: эксперименты над базами данных
Промышленный подход к тюнингу PostgreSQL: эксперименты над базами данныхПромышленный подход к тюнингу PostgreSQL: эксперименты над базами данных
Промышленный подход к тюнингу PostgreSQL: эксперименты над базами данных
Nikolay Samokhvalov
 

Ähnlich wie Cергей Голубчик, Monty Program AB (20)

Народные средства оптимизации PostgreSQL
Народные средства оптимизации PostgreSQLНародные средства оптимизации PostgreSQL
Народные средства оптимизации PostgreSQL
 
СУБД осень 2012 лекция 8
СУБД осень 2012 лекция 8СУБД осень 2012 лекция 8
СУБД осень 2012 лекция 8
 
Новые возможности отладки MySQL 5.7 на практике
Новые возможности отладки MySQL 5.7 на практикеНовые возможности отладки MySQL 5.7 на практике
Новые возможности отладки MySQL 5.7 на практике
 
лабраб 7
лабраб 7лабраб 7
лабраб 7
 
My sql 5.6-new-stable-mmug
My sql 5.6-new-stable-mmugMy sql 5.6-new-stable-mmug
My sql 5.6-new-stable-mmug
 
поиск узких мест в производительности My sql ботанический определитель. г. ру...
поиск узких мест в производительности My sql ботанический определитель. г. ру...поиск узких мест в производительности My sql ботанический определитель. г. ру...
поиск узких мест в производительности My sql ботанический определитель. г. ру...
 
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
То, что вы хотели знать о HandlerSocket, но не смогли нагуглитьТо, что вы хотели знать о HandlerSocket, но не смогли нагуглить
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
 
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить / Сергей Авер...
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить / Сергей Авер...То, что вы хотели знать о HandlerSocket, но не смогли нагуглить / Сергей Авер...
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить / Сергей Авер...
 
лабораторная работа 8
лабораторная работа 8лабораторная работа 8
лабораторная работа 8
 
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглитьСергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
 
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru GroupКак не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
 
InterBase XE7: Применение Change Views для синхронизации данных
InterBase XE7: Применение Change Views для синхронизации данныхInterBase XE7: Применение Change Views для синхронизации данных
InterBase XE7: Применение Change Views для синхронизации данных
 
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
 
CodeFest 2013. Аверин С. — MySQL+HandlerSocket=NoSQL
CodeFest 2013. Аверин С. — MySQL+HandlerSocket=NoSQLCodeFest 2013. Аверин С. — MySQL+HandlerSocket=NoSQL
CodeFest 2013. Аверин С. — MySQL+HandlerSocket=NoSQL
 
Новые возможности языка SQL в Firebird 3.0
Новые возможности языка SQL в Firebird 3.0Новые возможности языка SQL в Firebird 3.0
Новые возможности языка SQL в Firebird 3.0
 
Magento - Антон Капля
Magento - Антон КапляMagento - Антон Капля
Magento - Антон Капля
 
Оптимизации скорости выполнения запросов
Оптимизации скорости выполнения запросовОптимизации скорости выполнения запросов
Оптимизации скорости выполнения запросов
 
Производительность запросов в PostgreSQL - шаг за шагом / Илья Космодемьянски...
Производительность запросов в PostgreSQL - шаг за шагом / Илья Космодемьянски...Производительность запросов в PostgreSQL - шаг за шагом / Илья Космодемьянски...
Производительность запросов в PostgreSQL - шаг за шагом / Илья Космодемьянски...
 
User Aggs In As
User Aggs In AsUser Aggs In As
User Aggs In As
 
Промышленный подход к тюнингу PostgreSQL: эксперименты над базами данных
Промышленный подход к тюнингу PostgreSQL: эксперименты над базами данныхПромышленный подход к тюнингу PostgreSQL: эксперименты над базами данных
Промышленный подход к тюнингу PostgreSQL: эксперименты над базами данных
 

Mehr von Ontico

Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Ontico
 

Mehr von Ontico (20)

One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
 
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
 
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
 
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
 
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
 
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
 
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
 
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
 
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
 
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
 
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
 
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
 
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
 
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
 
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
 
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
 
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
 
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
 
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
 
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
 

Cергей Голубчик, Monty Program AB

  • 1. Оптимизатор запросов в MariaDB 10.0 — теперь и без индексов! Сергей Голубчик MariaDB
  • 2. Об этом докладе ● Engine Independent Statistics ● Что это такое ● Зачем это нужно ● Как считается ● Где хранится ● Примеры, примеры, примеры
  • 3. Статистика данных: как это было ● Оптимизатор спрашивает движок: ● «сколько примерно строк в таблице?» ● «сколько стоит просканировать всю таблицу?» ● «сколько стоит прочитать столько-то строк из такого-то индекса?» ● ● «сколько раз в среднем каждое значение встречается в таком-то индексе?» «сколько значений в таком-то индексе попадает в диапазон от… и до…?»
  • 4. Пример: нестабильность ● DBT-3: сложные аналитические запросы ● Q7: Volume Shipping Query ● 6 InnoDB таблиц – 7 разных планов – 12 минут, 25 минут, часы (таймаут) Q8: National Market Share Query – – – – 8 InnoDB таблиц 4 разных плана от 7 минут до 1.2 часа
  • 5. Пример: неправда MariaDB [test]> CREATE TABLE t1 (a INT, b INT, c INT, KEY(a,b)) ENGINE=MyISAM; MariaDB [test]> INSERT t1 VALUES (RAND()*1e5,RAND()*1e5,RAND()*1e5); ... 400 000 rows ... MariaDB [test]> SELECT COUNT(DISTINCT a) AS cardinality FROM t1; +-------------+ | cardinality | +-------------+ | 97794 | +-------------+ MariaDB [test]> SELECT cardinality FROM information_schema.statistics --> WHERE table_name='t1' AND column_name='a'; +-------------+ | cardinality | +-------------+ | 98304 | +-------------+ MariaDB [test]> ALTER TABLE t1 ENGINE=InnoDB; MariaDB [test]> SELECT cardinality FROM information_schema.statistics --> WHERE table_name='t1' AND column_name='a'; +-------------+ | cardinality | +-------------+ | 196914 | +-------------+
  • 7. Как это сделано ● новые таблицы в mysql ● конфигурационные переменные ● расширенная команда ANALYZE TABLE
  • 10. Команда ANALYZE TABLE ● ANALYZE TABLE table_name ● ANALYZE TABLE table_name PERSISTENT FOR ALL ● ANALYZE TABLE table_name PERSISTENT FOR COLUMNS (column1, column2, ...) INDEXES (index1, index2, ...)
  • 11. Что считается ● по таблицам ● ● количество строк по индексам ● обратная мощность
  • 12. Что считается ● по столбцам ● минимальное и максимальное значения ● процент NULL-ов ● средняя длина значения ● обратная мощность ● распределение значений (гистограмма)
  • 13. Пример CREATE TABLE t1 (a INT, b INT); INSERT t1 SELECT RAND()*1e5, RAND()*1e5; . . . . . . . . . . -- 512 тысяч строк CREATE TABLE t2 (c INT, d INT, KEY(c), KEY(d)); INSERT t2 SELECT FLOOR(RAND()*1e5/2)*2, FLOOR(RAND()*1e5/3)*3 FROM t1; CREATE TABLE t3 (e INT, f INT, KEY(f)); INSERT t3 SELECT * FROM t2; ANALYZE TABLE t3; SET OPTIMIZER_USE_CONDITION_SELECTIVITY=1; SELECT * FROM t1, t2, t3 WHERE t3.f=t1.a AND t2.c=t1.a AND t3.e<5; --> 1075 rows in set (1 min 19.25 sec) SET OPTIMIZER_USE_CONDITION_SELECTIVITY=3; SELECT * FROM t1, t2, t3 WHERE t3.f=t1.a AND t2.c=t1.a AND t3.e<5; --> 1075 rows in set (13.17 sec)
  • 14. Пример MariaDB [test]> . employees.sql MariaDB [employees]> ANALYZE TABLE departments, dept_emp, dept_manager, -> employees, salaries, titles; MariaDB [employees]> SET OPTIMIZER_USE_CONDITION_SELECTIVITY=1; Query OK, 0 rows affected (0.01 sec) MariaDB [employees]> SELECT * FROM departments JOIN dept_emp USING (dept_no) -> JOIN employees USING (emp_no) JOIN titles USING (emp_no) WHERE title='Manager'; 24 rows in set (15.13 sec) MariaDB [employees]> SET OPTIMIZER_USE_CONDITION_SELECTIVITY=3; Query OK, 0 rows affected (0.01 sec) MariaDB [employees]> SELECT * FROM departments JOIN dept_emp USING (dept_no) -> JOIN employees USING (emp_no) JOIN titles USING (emp_no) WHERE title='Manager'; 24 rows in set (0.53 sec)
  • 15. Пример MariaDB [employees]> EXPLAIN EXTENDED SELECT * FROM departments JOIN dept_emp USING (dept_no) -> JOIN employees USING (emp_no) JOIN titles USING (emp_no) WHERE title='Manager'; +------+-------------+--------+---------+-------+----------+-----------------------+ | id | table | type | key | rows | filtered | Extra | +------+-------------+--------+---------+-------+----------+-----------------------+ | 1 | departments | ALL | NULL | 9 | 100.00 | | | 1 | dept_emp | ref | dept_no | 36844 | 100.00 | | | 1 | employees | eq_ref | PRIMARY | 1 | 100.00 | | | 1 | titles | ref | PRIMARY | 1 | 100.00 | Using index condition | +------+-------------+--------+---------+-------+----------+-----------------------+ MariaDB [employees]> SET OPTIMIZER_USE_CONDITION_SELECTIVITY=3; MariaDB [employees]> EXPLAIN EXTENDED SELECT * FROM departments JOIN dept_emp USING (dept_no) -> JOIN employees USING (emp_no) JOIN titles USING (emp_no) WHERE title='Manager'; +------+-------------+--------+---------+--------+----------+-----------------------------| id | table | type | key | rows | filtered | Extra +------+-------------+--------+---------+--------+----------+-----------------------------| 1 | titles | ALL | NULL | 443308 | 14.29 | Using where | 1 | employees | eq_ref | PRIMARY | 1 | 100.00 | | 1 | dept_emp | ref | PRIMARY | 1 | 100.00 |
  • 16. Неравномерное распределение ● Таблица скачиваний какого-то продукта N ● Пусть, пользователи могут регистрироваться – и, где-то 1% на самом деле это делает … WHERE Registered = 'YES' … 990 000 YES 1,000,000 rows среднее количество строк на значение: 500,000 NO 10 000 Registered
  • 17. Гистограммы ● histogram_size=20 или любое число больше нуля ● optimizer_use_condition_selectivity=4 или 5 ● histogram_type=single_prec_hb или double_prec_hb
  • 19. Пример MariaDB [employees]> SET OPTIMIZER_USE_CONDITION_SELECTIVITY=3; Query OK, 0 rows affected (0.00 sec) MariaDB [employees]> SELECT * FROM employees JOIN salaries -> USING (emp_no) JOIN titles USING (emp_no) WHERE salary > 100000; 166014 rows in set (18.79 sec) MariaDB [employees]> SET OPTIMIZER_USE_CONDITION_SELECTIVITY=4; Query OK, 0 rows affected (0.00 sec) MariaDB [employees]> SELECT * FROM employees JOIN salaries -> USING (emp_no) JOIN titles USING (emp_no) WHERE salary > 100000; 166014 rows in set (6.64 sec)
  • 20. Пример MariaDB [employees]> EXPLAIN EXTENDED SELECT * FROM employees JOIN salaries -> USING (emp_no) JOIN titles USING (emp_no) WHERE salary > 100000; +------+-----------+--------+---------+--------+----------+-------------+ | id | table | type | key | rows | filtered | Extra | +------+-----------+--------+---------+--------+----------+-------------+ | 1 | titles | ALL | NULL | 443308 | 100.00 | | | 1 | employees | eq_ref | PRIMARY | 1 | 100.00 | | | 1 | salaries | ref | PRIMARY | 9 | 48.68 | Using where | +------+-----------+--------+---------+--------+----------+-------------+ 3 rows in set, 1 warning (0.00 sec) MariaDB [employees]> SET OPTIMIZER_USE_CONDITION_SELECTIVITY=4; Query OK, 0 rows affected (0.00 sec) MariaDB [employees]> EXPLAIN EXTENDED SELECT * FROM employees JOIN salaries -> USING (emp_no) JOIN titles USING (emp_no) WHERE salary > 100000; +------+-----------+--------+---------+---------+----------+-------------+ | id | table | type | key | rows | filtered | Extra | +------+-----------+--------+---------+---------+----------+-------------+ | 1 | salaries | ALL | NULL | 2844047 | 4.76 | Using where | | 1 | employees | eq_ref | PRIMARY | 1 | 100.00 | | | 1 | titles | ref | PRIMARY | 1 | 100.00 | | +------+-----------+--------+---------+---------+----------+-------------+ 3 rows in set, 1 warning (0.01 sec)
  • 21. Планы ● Другие типы гистограмм (например, равной ширины) ● Гистограммы для индексов (из нескольких столбцов!) ● Учет корреляций между столбцами