SlideShare a Scribd company logo
1 of 45
Download to read offline
MariaDB 10.4
Сергей Петруня
разработчик MariaDBчто нового
Open Source
Database Meetup
июнь 2019
Санкт-Петербург
2
Немного истории
● MariaDB 10.4 – 18 июня 2019
● MariaDB 10.3 – 25 мая 2018
● MariaDB 10.2 – 23 мая 2017
● MySQL 8.0 – 19 апреля 2018
● MySQL 5.7 – 21 октября 2015
● Percona Server for MySQL 8.0 – 21 декабря 2018
● Percona Server for MySQL 5.7 – 23 февраля 2016
3
Новые фичи в MariaDB 10.4
● Оптимизатор
● InnoDB
● Galera 4
● Application time для версионированных таблиц
4
Оптимизатор
5
MariaDB 10.4 - Оптимизатор
● Optimizer trace
● Улучшенное построение гистограмм
– новые установки по умолчанию
● Condition pushdown:
– Из HAVING во WHERE
– В IN-подзапросыподзапросы
● Primary Key Filters
6
Optimizer trace
● Появился в MySQL 5.6
mysql> set optimizer_trace=1;
mysql> <query>;
mysql> select * from
-> information_schema.optimizer_trace;
"steps": [
{
"join_preparation": {
"select#": 1,
"steps": [
{
"expanded_query": "/* select#1 */ select `t1`.`col1` AS `col1`,`t1`.`col2`
AS `col2` from `t1` where (`t1`.`col1` < 4)"
}
]
}
},
{
"join_optimization": {
"select#": 1,
"steps": [
{
"condition_processing": {
"condition": "WHERE",
"original_condition": "(`t1`.`col1` < 4)",
"steps": [
{
"transformation": "equality_propagation",
"resulting_condition": "(`t1`.`col1` < 4)"
},
{
"transformation": "constant_propagation",
"resulting_condition": "(`t1`.`col1` < 4)"
},
{
"transformation": "trivial_condition_removal",
"resulting_condition": "(`t1`.`col1` < 4)"
}
]
}
},
● Теперь, похожая фича в MariaDB
EXPLAIN ANALYZEOptimizer trace
Optimization
Query
PlanSQL Execution
7
Цель – понимать действия оптимизатора
● “Почему план запроса Х не был выбран?”
– Оптимизатор его рассматривал вообще?
– Какая была его стоимость (Неправильная статистика?)
● Какие преобразования делались
– Сгенерированные запросы часто имеют “бессмысленные” части
● WHERE col=123 ORDER BY col
– Делаются ли преобразования вида
“WHERE colX=10 AND func(colX)” -подзапросы> “func(10)” ?
● Разница между двумя версиями или машинами
– diff /tmp/trace_from_host1.json /tmp/trace_from_host2.json
● Какое-подзапросыто автоматическое использование?
8
Пример 1: range optimizer
● Сложное WHERE и многокомпонентный индекс
create table some_events (
start_date DATE,
end_date DATE,
...
KEY (start_date, end_date)
);
EXPLAIN: {
"query_block": {
"select_id": 1,
"table": {
"table_name": "TBL",
"access_type": "range",
"possible_keys": ["start_date"],
"key": "start_date",
"key_length": "8",
"used_key_parts": ["start_date", "end_date"],
"rows": 4503,
"filtered": 100,
"index_condition":
"TBL.start_date >= '2019-06-24' and
TBL.end_date < '2019-06-28'"
}
}
}
select ...
from some_events as TBL
where
start_date >= '2019-06-24' and
end_date <= '2019-06-28'
9
Пример 1: range optimizer
● Сложное WHERE и многокомпонентный индекс
create table some_events (
start_date DATE,
end_date DATE,
...
KEY (start_date, end_date)
);
select * from information_schema.optimizer_trace;
...
"analyzing_range_alternatives": {
"range_scan_alternatives": [
{
"index": "start_date",
"ranges": ["(2019-06-24,NULL) <
(start_date,end_date)"],
"rowid_ordered": false,
"using_mrr": false,
"index_only": false,
"rows": 4503,
"cost": 5638.8,
"chosen": true
}
],
...
select ...
from some_events as TBL
where
start_date >= '2019-06-24' and
end_date <= '2019-06-28'
10
Пример 2: VIEW, слияние перестало работать
● SELECT с большим количеством вложенных VIEW с algorithm=merge
● Резкое замедление после небольших изменений в одном из VIEW
– EXPLAIN показывает, что algorithm=merge больше не используется
● Сначала подозревали LEFT JOIN’ы ы
"view": {
"table": "view_name_8",
"select_id": 9,
"algorithm": "merged"
}
"view": {
"table": "view_name_8",
"select_id": 9,
"algorithm": "materialized",
"cause": "Not enough table bits to merge
subquery"
}
● (из-подзапросыза Table Elimination, EXPLAIN показывал <64 таблицы и до, и после)
11
Пример 3: Материализация не работает
● Некоррелированый, тяжелый подзапрос
+------+--------------------+-------+------+---------------+------+---------+------+---------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+--------------------+-------+------+---------------+------+---------+------+---------+-------------+
| 1 | PRIMARY | t1 | ALL | NULL | NULL | NULL | NULL | 1000 | Using where |
| 2 | DEPENDENT SUBQUERY | t2 | ALL | NULL | NULL | NULL | NULL | 1000000 | Using where |
+------+--------------------+-------+------+---------------+------+---------+------+---------+-------------+
"join_preparation": {
"select_id": 2,
"steps": [
{
"transformation": {
"select_id": 2,
"from": "IN (SELECT)",
"to": "materialization",
"possible": false,
"cause": "types mismatch"
}
● Материализация не применима, если
типы данных t1.col и t2.col “не подходят”
● Неочевидное ограничение
– Поняли только когда полезли с
отладчиком.
select * from t1 where t1.col in (select t2.col from t2 ...) or ...
12
Optimizer trace - структура
TRACE: steps: {
join_preparation+,
join_optimization+,
(join_explain | join_execution)+
}
join_optimization : steps {
condition_processing,
substitute_generated_columns,
table_dependencies,
ref_optimizer_key_uses,
rows_estimation,
considered_execution_plans,
attaching_conditions_to_tables,
refine_plan,
}
join_preparation : {
expanded_query
}
join_preparation : {
expanded_query
}
rows_estimation: {
analyzing_range_alternatives : { ... }
selectivity_for_indexes,
selectivity_for_columns,
cond_selectivity: 0.nnnn
}
13
Optimizer trace – выводы
● Показывает
– какие делаются преобразования
– какие рассматриваются [фрагменты] планов запросов
● Анализировать надо самому
● Также полезно прикладывать к bug reports
● Сейчас печатает самое главное
– Дальше больше
14
Улучшения в
гистограммах
15
Гистограммы / статистика
● Используется оптимизатором для выбора планов
● Оптимизатор MySQL/MariaDB использует индекс, как
большую гистограмму (records_in_range)
– Без этого – данных о selectivity нет.
● Информация о распределении данных
● Главным образом, condition selectivity
select ... from ...
where
orders.ship_date BETWEEN '2019-06-01' AND '2019-06-10' and ...
user.country = 'Russia' and...
16
Гистограммы / статистика в MariaDB 10.0
analyze table t persistent for ...
set optimizer_use_stat_tables=4;
set use_stat_tables='preferably';
<сложный запрос>;
● Гистограммы появились в MariaDB 10.0
● Сбор статистики дорогой
– Читает всю таблицу (и все индексы)
– Строит гистограмму из всех данных (это дорого)
● Сборку и использование надо включать вручную
● => Распространены меньше, чем хотелось бы
17
Гистограммы в MySQL 8.0
analyze table t update histogram on ...
<сложный запрос>;
● Похожи на MariaDB:
● Хранятся как JSON, можно сделать больше buckets, ...
● Построение тоже недешево:
– На основе @@histogram_generation_max_mem_size
определяем, сколько % данных участвует в гистограмме
– Читаем всю таблицу
– Bernoulli sampling (кидаем монетку для каждой записи)
18
Гистограммы в MariaDB 10.4
● Использование включено по умолчанию
– use_stat_tables=’preferably_for_queries’
– optimizer_use_condition_selectivity=...
● Сборка по-подзапросыпрежнему читает всю таблицу
– И Bernoulli sampling (кидаем монетку для каждой записи)
● Построение гистограммы: @@analyze_sample_percentage
– default=100 -подзапросы из всех данных
– 0 -подзапросы “автоматический размер выборки”
– n% -подзапросы использовать n% данных.
19
Проблема – коррелированные условия
● Сколько записей удовлетворяет всем условиям?
– MIN(1/n, 1/m)
– (1/n) * (1/m)
– 0?
select ...
from order_items
where shipdate='2015-12-15' AND item_name='christmas light'
'swimsuit'
20
Коррелированных условий бывает много
● Точность одной гистограммы уже не важна :-подзапросы(
● Требует консерватизма в сборке гистограмм
● Проблема сложная
– PostgreSQL: очень ограниченное решение в последней версии)
select ...
from cars
where
manufacturer='Ford' and
model='Focus 3' and
year between 2012 and 2014 and
engine_hp between 120 and 150 and
embedded_gps = 'Yes' and ...
21
Гистограммы в MariaDB 10.4 - выводы
● Были и раньше
● Помогают оптимизатору выбрать хороший план
● Собирать надо вручную, теперь это делают одной командой:
analyze table t persistent for columns(...) indexes (...)
analyze table t persistent for all;
– полный просмотр таблицы
– set @@analyze_sample_percentage=0
● Аккуратно с корреляцией колонок и большим числом условий
– гистограммы только по одной
22
Condition pushdown
23
Condition pushdown
● Non-подзапросыmergeable подзапрос (или VIEW) (или derived table) (или CTE)
(select
customer_id,
SUM(amount) as TOTAL_AMT
from orders
where
order_date BETWEEN '2017-10-01' and '2017-10-31'
group by
customer_id)
create view oct_totals as
24
Condition pushdown (2)
● Основному запросу требуются только несколько клиентов
(select
customer_id,
SUM(amount) as TOTAL_AMT
from orders
where
order_date BETWEEN '2017
group by
customer_id)
create view oct_totals asselect *
from oct_totals
where customer_id IN (1,2)
...
having customer_id IN (1,2)
select ...
from customer C, oct_totals
where
C.name_uniq_key='Ivan' and
C.customer_id = oct_totals.customer_id
25
Condition pushdown
● MariaDB 10.2: Condition pushdown в derived tables, views, нерекурсивные CTEs.
● MariaDB 10.3: Condition pushdown через PARTITION BY в window functions
● MariaDB 10.4
– Condition pushdown из HAVING во WHERE
– Condition pushdown в IN (SELECT ...) подзапросы во WHERE
● MySQL: не поддерживает
● PostgreSQL: поддерживает*, кроме нерекурсивных CTEs (исправят в PG12)
26
InnoDB в MariaDB 10.4
27
Мгновенный ALTER TABLE
● Некоторые виды ALTER TABLE можно выполнить мгновенно
alter table t1 add column col1 int;
ERROR 1845 (0A000): ALGORITHM=INSTANT is not supported for
this operation. Try ALGORITHM=COPY/INPLACE.
alter table t1 ... ,algorithm=instant;
● MariaDB 10.3, MySQL 8.0: instant ADD COLUMN
● Более ранние версии – INPLACE преобразования
28
Мгновенный ALTER TABLE в MariaDB 10.4
● ADD COLUMN, добавить колонку не в конец
● ALTER TABLE ... DROP COLUMN
● Увеличение длины VARCHAR(n), INT -подзапросы> BIGINT
● Многие “расширяющие” изменения character set
– utf8 -подзапросы> utf8mb4
● Для не-подзапросыиндексных колонок – смена collation
● Для колонок в индексах – смена collation на тот, у которого
сортировка “покрывает” текущую
29
Galera 4
30
Galera 4
● Galera 4 является частью MariaDB 10.4
● Новые возможности
– Streaming replication (Huge transactions)
– Реплицированные транзакции участвуют в Group Commit
– Backup locks
31
Версионированные
таблицы
32
Версионирование таблиц
● SQL:2011 включает версионирование таблиц
– System-подзапросыversioned tables
– Application-подзапросыtime periods
– “Bitemporal” таблицы
● Реализации
– Oracle 12C
– SQL Server 2016
– DB2
– MariaDB :-подзапросы)
33
System-versioned tables
● Таблица может поддерживать версионирование:
CREATE TABLE t(
x INT,
start_timestamp TIMESTAMP(6) GENERATED ALWAYS AS ROW START,
end_timestamp TIMESTAMP(6) GENERATED ALWAYS AS ROW END,
PERIOD FOR SYSTEM_TIME(start_timestamp, end_timestamp)
) WITH SYSTEM VERSIONING;
CREATE TABLE t(
x INT,
) WITH SYSTEM VERSIONING;
● Таблица может поддерживать версионирование:
● Колонки для версий можно объявить явно:
34
System-versioned tables (2)
● По-подзапросыумолчанию видны только последние данные
SELECT * FROM t FOR SYSTEM_TIME AS OF TIMESTAMP'2016-10-09 08:07:06';
SELECT * FROM t;
● Можно смотреть в прошлое
● Или изучать период в прошлом:
SELECT * FROM t FOR SYSTEM_TIME FROM '2016-01-01 00:00:00'
TO '2017-01-01 00:00:00';
SET @@system_versioning_asof= TIMESTAMP'2016-10-09 08:07:06'
35
System-versioned tables (3)
● История “пишется” автоматически
– Удалить нельзя
● Подоходит для
– Аудита
– Логирования всех действий
– Возможности восстановления данных
● Еще там есть partitioning, привязка к номеру транзакции, ...
● Доступно в MariaDB 10.3
36
Application-time periods
● System versioning
– История изменений в БД, а не той области, про которую данные
– период применимости данных= время внесения изменений в БД
– Редактировать историю нельзя
● Application-подзапросыtime:
– Приложение в явном виде управляет start_time/end_time
– Возможность вносить данные до/после события
– Редактирование истории, будущего и тд.
37
Application-time periods
● Пример
CREATE TABLE emp(
emp_name VARCHAR(100),
...
start_date DATE,
end_date DATE,
PERIOD FOR emp_period(start_date, end_date)
);
– Автоматически заводит constraint, start_date<=end_date
38
Application-time periods (2)
● Другой синтаксис:
CREATE TABLE emp(
emp_name VARCHAR(100),
...
start_date DATE,
end_date DATE,
PERIOD FOR emp_period(start_date, end_date)
);
● Даты можно указывать любые
insert into emp
values ('John', ..., DATE'2015-01-01', DATE'2020-12-31');
– Автоматически заводит constraint, start_date<=end_date
39
Application-time periods (3)
● DELETE/UPDATE поддерживают FOR PORTION OF:
DELETE FROM emp
FOR PORTION OF emp_period FROM DATE '2019-06-01'
TO DATE '2019-07-01'
WHERE
emp_name='John';
● Вносят изменение во временной диапазон
SELECT * FROM emp;
+----------+------------+------------+
| emp_name | start_date | end_date |
+----------+------------+------------+
| John | 2015-01-01 | 2019-06-01 |
| John | 2019-07-01 | 2020-12-31 |
+----------+------------+------------+
40
Application-time periods (4)
● Битемпоральная таблица – таблица с system versioning и с
application time period одновременно.
41
Ничего не забыли?
42
Authentication в MariaDB 10.4
● Несколько authentication plugins для каждого пользователя
● root@localhost может использовать unix socket plugin
– Пользователю root пароль не будет нужен
– Остальных не пустят
– => Нету беспарольного root@localhost после установки (и
debian-подзапросыsys-подзапросыmaint тоже)
● Изменения в системных таблицах
– mysql.user -подзапросы> mysql.global_priv
● Истечение паролей
43
Итого
44
Выводы – MariaDB 10.4
● Оптимизатор
– optimizer trace
– улучшенные гистограммы
– улучшенный Condition pushdown
● InnoDB – больше покрытие мгновенных ALTER TABLE
● Galera 4
● Application time for system-подзапросыversioned tables
● и много чего еще!
45
Спасибо за
внимание!

More Related Content

Similar to MariaDB 10.4 - что нового

Magento - Антон Капля
Magento - Антон КапляMagento - Антон Капля
Magento - Антон Капляmeet_magento
 
#PostgreSQLRussia в банке Тинькофф, доклад №1
#PostgreSQLRussia в банке Тинькофф, доклад №1#PostgreSQLRussia в банке Тинькофф, доклад №1
#PostgreSQLRussia в банке Тинькофф, доклад №1Nikolay Samokhvalov
 
Oracle 12c Automatic Dynamic Sampling
Oracle 12c Automatic Dynamic SamplingOracle 12c Automatic Dynamic Sampling
Oracle 12c Automatic Dynamic SamplingIgor Usoltsev
 
Промышленный подход к тюнингу PostgreSQL: эксперименты над базами данных
Промышленный подход к тюнингу PostgreSQL: эксперименты над базами данныхПромышленный подход к тюнингу PostgreSQL: эксперименты над базами данных
Промышленный подход к тюнингу PostgreSQL: эксперименты над базами данныхNikolay Samokhvalov
 
Построение и переход на новую аналитическую платформу. Цели, вызовы, решения....
Построение и переход на новую аналитическую платформу. Цели, вызовы, решения....Построение и переход на новую аналитическую платформу. Цели, вызовы, решения....
Построение и переход на новую аналитическую платформу. Цели, вызовы, решения....HOWWEDOIT
 
поиск узких мест в производительности My sql ботанический определитель. г. ру...
поиск узких мест в производительности My sql ботанический определитель. г. ру...поиск узких мест в производительности My sql ботанический определитель. г. ру...
поиск узких мест в производительности My sql ботанический определитель. г. ру...rit2011
 
05 db server_deployment_ru
05 db server_deployment_ru05 db server_deployment_ru
05 db server_deployment_rumcroitor
 
Time series data in a relational database. TimescaleDB and PipelineDB extensi...
Time series data in a relational database. TimescaleDB and PipelineDB extensi...Time series data in a relational database. TimescaleDB and PipelineDB extensi...
Time series data in a relational database. TimescaleDB and PipelineDB extensi...Ivan Muratov
 
SQL-ник DevDay. Рубцов. Новое в Percona Server и MariaDB в сравнении с MySQL 5.5
SQL-ник DevDay. Рубцов. Новое в Percona Server и MariaDB в сравнении с MySQL 5.5SQL-ник DevDay. Рубцов. Новое в Percona Server и MariaDB в сравнении с MySQL 5.5
SQL-ник DevDay. Рубцов. Новое в Percona Server и MariaDB в сравнении с MySQL 5.5DevDay
 
Профилирование кода на C/C++ в *nix-системах / Александр Алексеев (Postgres P...
Профилирование кода на C/C++ в *nix-системах / Александр Алексеев (Postgres P...Профилирование кода на C/C++ в *nix-системах / Александр Алексеев (Postgres P...
Профилирование кода на C/C++ в *nix-системах / Александр Алексеев (Postgres P...Ontico
 
Профилирование кода на C/C++ в *nix системах
Профилирование кода на C/C++ в *nix системахПрофилирование кода на C/C++ в *nix системах
Профилирование кода на C/C++ в *nix системахAleksander Alekseev
 
Делаем очередь поверх Кассандры
Делаем очередь поверх КассандрыДелаем очередь поверх Кассандры
Делаем очередь поверх КассандрыDotNetConf
 
Мониторинг и отладка MySQL: максимум информации при минимальных потерях
Мониторинг и отладка MySQL: максимум информации при минимальных потеряхМониторинг и отладка MySQL: максимум информации при минимальных потерях
Мониторинг и отладка MySQL: максимум информации при минимальных потеряхSveta Smirnova
 
Мониторинг и отладка MySQL: максимум информации при минимальных потерях / Све...
Мониторинг и отладка MySQL: максимум информации при минимальных потерях / Све...Мониторинг и отладка MySQL: максимум информации при минимальных потерях / Све...
Мониторинг и отладка MySQL: максимум информации при минимальных потерях / Све...Ontico
 
ObjectManager, или как работать с большим количеством объектов на карте, Мари...
ObjectManager, или как работать с большим количеством объектов на карте, Мари...ObjectManager, или как работать с большим количеством объектов на карте, Мари...
ObjectManager, или как работать с большим количеством объектов на карте, Мари...Ontico
 
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-mmugAndrey Tokarchuk
 
Использование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиИспользование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиvictor-yastrebov
 
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...Yandex
 
Hacking PostgreSQL. Обзор исходного кода
Hacking PostgreSQL. Обзор исходного кодаHacking PostgreSQL. Обзор исходного кода
Hacking PostgreSQL. Обзор исходного кодаAnastasia Lubennikova
 

Similar to MariaDB 10.4 - что нового (20)

Magento - Антон Капля
Magento - Антон КапляMagento - Антон Капля
Magento - Антон Капля
 
#PostgreSQLRussia в банке Тинькофф, доклад №1
#PostgreSQLRussia в банке Тинькофф, доклад №1#PostgreSQLRussia в банке Тинькофф, доклад №1
#PostgreSQLRussia в банке Тинькофф, доклад №1
 
Oracle 12c Automatic Dynamic Sampling
Oracle 12c Automatic Dynamic SamplingOracle 12c Automatic Dynamic Sampling
Oracle 12c Automatic Dynamic Sampling
 
Промышленный подход к тюнингу PostgreSQL: эксперименты над базами данных
Промышленный подход к тюнингу PostgreSQL: эксперименты над базами данныхПромышленный подход к тюнингу PostgreSQL: эксперименты над базами данных
Промышленный подход к тюнингу PostgreSQL: эксперименты над базами данных
 
Построение и переход на новую аналитическую платформу. Цели, вызовы, решения....
Построение и переход на новую аналитическую платформу. Цели, вызовы, решения....Построение и переход на новую аналитическую платформу. Цели, вызовы, решения....
Построение и переход на новую аналитическую платформу. Цели, вызовы, решения....
 
поиск узких мест в производительности My sql ботанический определитель. г. ру...
поиск узких мест в производительности My sql ботанический определитель. г. ру...поиск узких мест в производительности My sql ботанический определитель. г. ру...
поиск узких мест в производительности My sql ботанический определитель. г. ру...
 
05 db server_deployment_ru
05 db server_deployment_ru05 db server_deployment_ru
05 db server_deployment_ru
 
Time series data in a relational database. TimescaleDB and PipelineDB extensi...
Time series data in a relational database. TimescaleDB and PipelineDB extensi...Time series data in a relational database. TimescaleDB and PipelineDB extensi...
Time series data in a relational database. TimescaleDB and PipelineDB extensi...
 
SQL-ник DevDay. Рубцов. Новое в Percona Server и MariaDB в сравнении с MySQL 5.5
SQL-ник DevDay. Рубцов. Новое в Percona Server и MariaDB в сравнении с MySQL 5.5SQL-ник DevDay. Рубцов. Новое в Percona Server и MariaDB в сравнении с MySQL 5.5
SQL-ник DevDay. Рубцов. Новое в Percona Server и MariaDB в сравнении с MySQL 5.5
 
Профилирование кода на C/C++ в *nix-системах / Александр Алексеев (Postgres P...
Профилирование кода на C/C++ в *nix-системах / Александр Алексеев (Postgres P...Профилирование кода на C/C++ в *nix-системах / Александр Алексеев (Postgres P...
Профилирование кода на C/C++ в *nix-системах / Александр Алексеев (Postgres P...
 
Профилирование кода на C/C++ в *nix системах
Профилирование кода на C/C++ в *nix системахПрофилирование кода на C/C++ в *nix системах
Профилирование кода на C/C++ в *nix системах
 
Делаем очередь поверх Кассандры
Делаем очередь поверх КассандрыДелаем очередь поверх Кассандры
Делаем очередь поверх Кассандры
 
Мониторинг и отладка MySQL: максимум информации при минимальных потерях
Мониторинг и отладка MySQL: максимум информации при минимальных потеряхМониторинг и отладка MySQL: максимум информации при минимальных потерях
Мониторинг и отладка MySQL: максимум информации при минимальных потерях
 
Мониторинг и отладка MySQL: максимум информации при минимальных потерях / Све...
Мониторинг и отладка MySQL: максимум информации при минимальных потерях / Све...Мониторинг и отладка MySQL: максимум информации при минимальных потерях / Све...
Мониторинг и отладка MySQL: максимум информации при минимальных потерях / Све...
 
ObjectManager, или как работать с большим количеством объектов на карте, Мари...
ObjectManager, или как работать с большим количеством объектов на карте, Мари...ObjectManager, или как работать с большим количеством объектов на карте, Мари...
ObjectManager, или как работать с большим количеством объектов на карте, Мари...
 
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
 
Использование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиИспользование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработки
 
Гравицапа
ГравицапаГравицапа
Гравицапа
 
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
 
Hacking PostgreSQL. Обзор исходного кода
Hacking PostgreSQL. Обзор исходного кодаHacking PostgreSQL. Обзор исходного кода
Hacking PostgreSQL. Обзор исходного кода
 

More from Sergey Petrunya

New optimizer features in MariaDB releases before 10.12
New optimizer features in MariaDB releases before 10.12New optimizer features in MariaDB releases before 10.12
New optimizer features in MariaDB releases before 10.12Sergey Petrunya
 
MariaDB's join optimizer: how it works and current fixes
MariaDB's join optimizer: how it works and current fixesMariaDB's join optimizer: how it works and current fixes
MariaDB's join optimizer: how it works and current fixesSergey Petrunya
 
Improved histograms in MariaDB 10.8
Improved histograms in MariaDB 10.8Improved histograms in MariaDB 10.8
Improved histograms in MariaDB 10.8Sergey Petrunya
 
Improving MariaDB’s Query Optimizer with better selectivity estimates
Improving MariaDB’s Query Optimizer with better selectivity estimatesImproving MariaDB’s Query Optimizer with better selectivity estimates
Improving MariaDB’s Query Optimizer with better selectivity estimatesSergey Petrunya
 
JSON Support in MariaDB: News, non-news and the bigger picture
JSON Support in MariaDB: News, non-news and the bigger pictureJSON Support in MariaDB: News, non-news and the bigger picture
JSON Support in MariaDB: News, non-news and the bigger pictureSergey Petrunya
 
Optimizer Trace Walkthrough
Optimizer Trace WalkthroughOptimizer Trace Walkthrough
Optimizer Trace WalkthroughSergey Petrunya
 
ANALYZE for Statements - MariaDB's hidden gem
ANALYZE for Statements - MariaDB's hidden gemANALYZE for Statements - MariaDB's hidden gem
ANALYZE for Statements - MariaDB's hidden gemSergey Petrunya
 
Optimizer features in recent releases of other databases
Optimizer features in recent releases of other databasesOptimizer features in recent releases of other databases
Optimizer features in recent releases of other databasesSergey Petrunya
 
Using histograms to get better performance
Using histograms to get better performanceUsing histograms to get better performance
Using histograms to get better performanceSergey Petrunya
 
MariaDB Optimizer - further down the rabbit hole
MariaDB Optimizer - further down the rabbit holeMariaDB Optimizer - further down the rabbit hole
MariaDB Optimizer - further down the rabbit holeSergey Petrunya
 
Query Optimizer in MariaDB 10.4
Query Optimizer in MariaDB 10.4Query Optimizer in MariaDB 10.4
Query Optimizer in MariaDB 10.4Sergey Petrunya
 
Lessons for the optimizer from running the TPC-DS benchmark
Lessons for the optimizer from running the TPC-DS benchmarkLessons for the optimizer from running the TPC-DS benchmark
Lessons for the optimizer from running the TPC-DS benchmarkSergey Petrunya
 
MariaDB 10.3 Optimizer - where does it stand
MariaDB 10.3 Optimizer - where does it standMariaDB 10.3 Optimizer - where does it stand
MariaDB 10.3 Optimizer - where does it standSergey Petrunya
 
MyRocks in MariaDB | M18
MyRocks in MariaDB | M18MyRocks in MariaDB | M18
MyRocks in MariaDB | M18Sergey Petrunya
 
New Query Optimizer features in MariaDB 10.3
New Query Optimizer features in MariaDB 10.3New Query Optimizer features in MariaDB 10.3
New Query Optimizer features in MariaDB 10.3Sergey Petrunya
 
Histograms in MariaDB, MySQL and PostgreSQL
Histograms in MariaDB, MySQL and PostgreSQLHistograms in MariaDB, MySQL and PostgreSQL
Histograms in MariaDB, MySQL and PostgreSQLSergey Petrunya
 
Common Table Expressions in MariaDB 10.2
Common Table Expressions in MariaDB 10.2Common Table Expressions in MariaDB 10.2
Common Table Expressions in MariaDB 10.2Sergey Petrunya
 
MyRocks in MariaDB: why and how
MyRocks in MariaDB: why and howMyRocks in MariaDB: why and how
MyRocks in MariaDB: why and howSergey Petrunya
 

More from Sergey Petrunya (20)

New optimizer features in MariaDB releases before 10.12
New optimizer features in MariaDB releases before 10.12New optimizer features in MariaDB releases before 10.12
New optimizer features in MariaDB releases before 10.12
 
MariaDB's join optimizer: how it works and current fixes
MariaDB's join optimizer: how it works and current fixesMariaDB's join optimizer: how it works and current fixes
MariaDB's join optimizer: how it works and current fixes
 
Improved histograms in MariaDB 10.8
Improved histograms in MariaDB 10.8Improved histograms in MariaDB 10.8
Improved histograms in MariaDB 10.8
 
Improving MariaDB’s Query Optimizer with better selectivity estimates
Improving MariaDB’s Query Optimizer with better selectivity estimatesImproving MariaDB’s Query Optimizer with better selectivity estimates
Improving MariaDB’s Query Optimizer with better selectivity estimates
 
JSON Support in MariaDB: News, non-news and the bigger picture
JSON Support in MariaDB: News, non-news and the bigger pictureJSON Support in MariaDB: News, non-news and the bigger picture
JSON Support in MariaDB: News, non-news and the bigger picture
 
Optimizer Trace Walkthrough
Optimizer Trace WalkthroughOptimizer Trace Walkthrough
Optimizer Trace Walkthrough
 
ANALYZE for Statements - MariaDB's hidden gem
ANALYZE for Statements - MariaDB's hidden gemANALYZE for Statements - MariaDB's hidden gem
ANALYZE for Statements - MariaDB's hidden gem
 
Optimizer features in recent releases of other databases
Optimizer features in recent releases of other databasesOptimizer features in recent releases of other databases
Optimizer features in recent releases of other databases
 
Using histograms to get better performance
Using histograms to get better performanceUsing histograms to get better performance
Using histograms to get better performance
 
MariaDB Optimizer - further down the rabbit hole
MariaDB Optimizer - further down the rabbit holeMariaDB Optimizer - further down the rabbit hole
MariaDB Optimizer - further down the rabbit hole
 
Query Optimizer in MariaDB 10.4
Query Optimizer in MariaDB 10.4Query Optimizer in MariaDB 10.4
Query Optimizer in MariaDB 10.4
 
Lessons for the optimizer from running the TPC-DS benchmark
Lessons for the optimizer from running the TPC-DS benchmarkLessons for the optimizer from running the TPC-DS benchmark
Lessons for the optimizer from running the TPC-DS benchmark
 
MariaDB 10.3 Optimizer - where does it stand
MariaDB 10.3 Optimizer - where does it standMariaDB 10.3 Optimizer - where does it stand
MariaDB 10.3 Optimizer - where does it stand
 
MyRocks in MariaDB | M18
MyRocks in MariaDB | M18MyRocks in MariaDB | M18
MyRocks in MariaDB | M18
 
New Query Optimizer features in MariaDB 10.3
New Query Optimizer features in MariaDB 10.3New Query Optimizer features in MariaDB 10.3
New Query Optimizer features in MariaDB 10.3
 
MyRocks in MariaDB
MyRocks in MariaDBMyRocks in MariaDB
MyRocks in MariaDB
 
Histograms in MariaDB, MySQL and PostgreSQL
Histograms in MariaDB, MySQL and PostgreSQLHistograms in MariaDB, MySQL and PostgreSQL
Histograms in MariaDB, MySQL and PostgreSQL
 
Say Hello to MyRocks
Say Hello to MyRocksSay Hello to MyRocks
Say Hello to MyRocks
 
Common Table Expressions in MariaDB 10.2
Common Table Expressions in MariaDB 10.2Common Table Expressions in MariaDB 10.2
Common Table Expressions in MariaDB 10.2
 
MyRocks in MariaDB: why and how
MyRocks in MariaDB: why and howMyRocks in MariaDB: why and how
MyRocks in MariaDB: why and how
 

MariaDB 10.4 - что нового

  • 1. MariaDB 10.4 Сергей Петруня разработчик MariaDBчто нового Open Source Database Meetup июнь 2019 Санкт-Петербург
  • 2. 2 Немного истории ● MariaDB 10.4 – 18 июня 2019 ● MariaDB 10.3 – 25 мая 2018 ● MariaDB 10.2 – 23 мая 2017 ● MySQL 8.0 – 19 апреля 2018 ● MySQL 5.7 – 21 октября 2015 ● Percona Server for MySQL 8.0 – 21 декабря 2018 ● Percona Server for MySQL 5.7 – 23 февраля 2016
  • 3. 3 Новые фичи в MariaDB 10.4 ● Оптимизатор ● InnoDB ● Galera 4 ● Application time для версионированных таблиц
  • 5. 5 MariaDB 10.4 - Оптимизатор ● Optimizer trace ● Улучшенное построение гистограмм – новые установки по умолчанию ● Condition pushdown: – Из HAVING во WHERE – В IN-подзапросыподзапросы ● Primary Key Filters
  • 6. 6 Optimizer trace ● Появился в MySQL 5.6 mysql> set optimizer_trace=1; mysql> <query>; mysql> select * from -> information_schema.optimizer_trace; "steps": [ { "join_preparation": { "select#": 1, "steps": [ { "expanded_query": "/* select#1 */ select `t1`.`col1` AS `col1`,`t1`.`col2` AS `col2` from `t1` where (`t1`.`col1` < 4)" } ] } }, { "join_optimization": { "select#": 1, "steps": [ { "condition_processing": { "condition": "WHERE", "original_condition": "(`t1`.`col1` < 4)", "steps": [ { "transformation": "equality_propagation", "resulting_condition": "(`t1`.`col1` < 4)" }, { "transformation": "constant_propagation", "resulting_condition": "(`t1`.`col1` < 4)" }, { "transformation": "trivial_condition_removal", "resulting_condition": "(`t1`.`col1` < 4)" } ] } }, ● Теперь, похожая фича в MariaDB EXPLAIN ANALYZEOptimizer trace Optimization Query PlanSQL Execution
  • 7. 7 Цель – понимать действия оптимизатора ● “Почему план запроса Х не был выбран?” – Оптимизатор его рассматривал вообще? – Какая была его стоимость (Неправильная статистика?) ● Какие преобразования делались – Сгенерированные запросы часто имеют “бессмысленные” части ● WHERE col=123 ORDER BY col – Делаются ли преобразования вида “WHERE colX=10 AND func(colX)” -подзапросы> “func(10)” ? ● Разница между двумя версиями или машинами – diff /tmp/trace_from_host1.json /tmp/trace_from_host2.json ● Какое-подзапросыто автоматическое использование?
  • 8. 8 Пример 1: range optimizer ● Сложное WHERE и многокомпонентный индекс create table some_events ( start_date DATE, end_date DATE, ... KEY (start_date, end_date) ); EXPLAIN: { "query_block": { "select_id": 1, "table": { "table_name": "TBL", "access_type": "range", "possible_keys": ["start_date"], "key": "start_date", "key_length": "8", "used_key_parts": ["start_date", "end_date"], "rows": 4503, "filtered": 100, "index_condition": "TBL.start_date >= '2019-06-24' and TBL.end_date < '2019-06-28'" } } } select ... from some_events as TBL where start_date >= '2019-06-24' and end_date <= '2019-06-28'
  • 9. 9 Пример 1: range optimizer ● Сложное WHERE и многокомпонентный индекс create table some_events ( start_date DATE, end_date DATE, ... KEY (start_date, end_date) ); select * from information_schema.optimizer_trace; ... "analyzing_range_alternatives": { "range_scan_alternatives": [ { "index": "start_date", "ranges": ["(2019-06-24,NULL) < (start_date,end_date)"], "rowid_ordered": false, "using_mrr": false, "index_only": false, "rows": 4503, "cost": 5638.8, "chosen": true } ], ... select ... from some_events as TBL where start_date >= '2019-06-24' and end_date <= '2019-06-28'
  • 10. 10 Пример 2: VIEW, слияние перестало работать ● SELECT с большим количеством вложенных VIEW с algorithm=merge ● Резкое замедление после небольших изменений в одном из VIEW – EXPLAIN показывает, что algorithm=merge больше не используется ● Сначала подозревали LEFT JOIN’ы ы "view": { "table": "view_name_8", "select_id": 9, "algorithm": "merged" } "view": { "table": "view_name_8", "select_id": 9, "algorithm": "materialized", "cause": "Not enough table bits to merge subquery" } ● (из-подзапросыза Table Elimination, EXPLAIN показывал <64 таблицы и до, и после)
  • 11. 11 Пример 3: Материализация не работает ● Некоррелированый, тяжелый подзапрос +------+--------------------+-------+------+---------------+------+---------+------+---------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +------+--------------------+-------+------+---------------+------+---------+------+---------+-------------+ | 1 | PRIMARY | t1 | ALL | NULL | NULL | NULL | NULL | 1000 | Using where | | 2 | DEPENDENT SUBQUERY | t2 | ALL | NULL | NULL | NULL | NULL | 1000000 | Using where | +------+--------------------+-------+------+---------------+------+---------+------+---------+-------------+ "join_preparation": { "select_id": 2, "steps": [ { "transformation": { "select_id": 2, "from": "IN (SELECT)", "to": "materialization", "possible": false, "cause": "types mismatch" } ● Материализация не применима, если типы данных t1.col и t2.col “не подходят” ● Неочевидное ограничение – Поняли только когда полезли с отладчиком. select * from t1 where t1.col in (select t2.col from t2 ...) or ...
  • 12. 12 Optimizer trace - структура TRACE: steps: { join_preparation+, join_optimization+, (join_explain | join_execution)+ } join_optimization : steps { condition_processing, substitute_generated_columns, table_dependencies, ref_optimizer_key_uses, rows_estimation, considered_execution_plans, attaching_conditions_to_tables, refine_plan, } join_preparation : { expanded_query } join_preparation : { expanded_query } rows_estimation: { analyzing_range_alternatives : { ... } selectivity_for_indexes, selectivity_for_columns, cond_selectivity: 0.nnnn }
  • 13. 13 Optimizer trace – выводы ● Показывает – какие делаются преобразования – какие рассматриваются [фрагменты] планов запросов ● Анализировать надо самому ● Также полезно прикладывать к bug reports ● Сейчас печатает самое главное – Дальше больше
  • 15. 15 Гистограммы / статистика ● Используется оптимизатором для выбора планов ● Оптимизатор MySQL/MariaDB использует индекс, как большую гистограмму (records_in_range) – Без этого – данных о selectivity нет. ● Информация о распределении данных ● Главным образом, condition selectivity select ... from ... where orders.ship_date BETWEEN '2019-06-01' AND '2019-06-10' and ... user.country = 'Russia' and...
  • 16. 16 Гистограммы / статистика в MariaDB 10.0 analyze table t persistent for ... set optimizer_use_stat_tables=4; set use_stat_tables='preferably'; <сложный запрос>; ● Гистограммы появились в MariaDB 10.0 ● Сбор статистики дорогой – Читает всю таблицу (и все индексы) – Строит гистограмму из всех данных (это дорого) ● Сборку и использование надо включать вручную ● => Распространены меньше, чем хотелось бы
  • 17. 17 Гистограммы в MySQL 8.0 analyze table t update histogram on ... <сложный запрос>; ● Похожи на MariaDB: ● Хранятся как JSON, можно сделать больше buckets, ... ● Построение тоже недешево: – На основе @@histogram_generation_max_mem_size определяем, сколько % данных участвует в гистограмме – Читаем всю таблицу – Bernoulli sampling (кидаем монетку для каждой записи)
  • 18. 18 Гистограммы в MariaDB 10.4 ● Использование включено по умолчанию – use_stat_tables=’preferably_for_queries’ – optimizer_use_condition_selectivity=... ● Сборка по-подзапросыпрежнему читает всю таблицу – И Bernoulli sampling (кидаем монетку для каждой записи) ● Построение гистограммы: @@analyze_sample_percentage – default=100 -подзапросы из всех данных – 0 -подзапросы “автоматический размер выборки” – n% -подзапросы использовать n% данных.
  • 19. 19 Проблема – коррелированные условия ● Сколько записей удовлетворяет всем условиям? – MIN(1/n, 1/m) – (1/n) * (1/m) – 0? select ... from order_items where shipdate='2015-12-15' AND item_name='christmas light' 'swimsuit'
  • 20. 20 Коррелированных условий бывает много ● Точность одной гистограммы уже не важна :-подзапросы( ● Требует консерватизма в сборке гистограмм ● Проблема сложная – PostgreSQL: очень ограниченное решение в последней версии) select ... from cars where manufacturer='Ford' and model='Focus 3' and year between 2012 and 2014 and engine_hp between 120 and 150 and embedded_gps = 'Yes' and ...
  • 21. 21 Гистограммы в MariaDB 10.4 - выводы ● Были и раньше ● Помогают оптимизатору выбрать хороший план ● Собирать надо вручную, теперь это делают одной командой: analyze table t persistent for columns(...) indexes (...) analyze table t persistent for all; – полный просмотр таблицы – set @@analyze_sample_percentage=0 ● Аккуратно с корреляцией колонок и большим числом условий – гистограммы только по одной
  • 23. 23 Condition pushdown ● Non-подзапросыmergeable подзапрос (или VIEW) (или derived table) (или CTE) (select customer_id, SUM(amount) as TOTAL_AMT from orders where order_date BETWEEN '2017-10-01' and '2017-10-31' group by customer_id) create view oct_totals as
  • 24. 24 Condition pushdown (2) ● Основному запросу требуются только несколько клиентов (select customer_id, SUM(amount) as TOTAL_AMT from orders where order_date BETWEEN '2017 group by customer_id) create view oct_totals asselect * from oct_totals where customer_id IN (1,2) ... having customer_id IN (1,2) select ... from customer C, oct_totals where C.name_uniq_key='Ivan' and C.customer_id = oct_totals.customer_id
  • 25. 25 Condition pushdown ● MariaDB 10.2: Condition pushdown в derived tables, views, нерекурсивные CTEs. ● MariaDB 10.3: Condition pushdown через PARTITION BY в window functions ● MariaDB 10.4 – Condition pushdown из HAVING во WHERE – Condition pushdown в IN (SELECT ...) подзапросы во WHERE ● MySQL: не поддерживает ● PostgreSQL: поддерживает*, кроме нерекурсивных CTEs (исправят в PG12)
  • 27. 27 Мгновенный ALTER TABLE ● Некоторые виды ALTER TABLE можно выполнить мгновенно alter table t1 add column col1 int; ERROR 1845 (0A000): ALGORITHM=INSTANT is not supported for this operation. Try ALGORITHM=COPY/INPLACE. alter table t1 ... ,algorithm=instant; ● MariaDB 10.3, MySQL 8.0: instant ADD COLUMN ● Более ранние версии – INPLACE преобразования
  • 28. 28 Мгновенный ALTER TABLE в MariaDB 10.4 ● ADD COLUMN, добавить колонку не в конец ● ALTER TABLE ... DROP COLUMN ● Увеличение длины VARCHAR(n), INT -подзапросы> BIGINT ● Многие “расширяющие” изменения character set – utf8 -подзапросы> utf8mb4 ● Для не-подзапросыиндексных колонок – смена collation ● Для колонок в индексах – смена collation на тот, у которого сортировка “покрывает” текущую
  • 30. 30 Galera 4 ● Galera 4 является частью MariaDB 10.4 ● Новые возможности – Streaming replication (Huge transactions) – Реплицированные транзакции участвуют в Group Commit – Backup locks
  • 32. 32 Версионирование таблиц ● SQL:2011 включает версионирование таблиц – System-подзапросыversioned tables – Application-подзапросыtime periods – “Bitemporal” таблицы ● Реализации – Oracle 12C – SQL Server 2016 – DB2 – MariaDB :-подзапросы)
  • 33. 33 System-versioned tables ● Таблица может поддерживать версионирование: CREATE TABLE t( x INT, start_timestamp TIMESTAMP(6) GENERATED ALWAYS AS ROW START, end_timestamp TIMESTAMP(6) GENERATED ALWAYS AS ROW END, PERIOD FOR SYSTEM_TIME(start_timestamp, end_timestamp) ) WITH SYSTEM VERSIONING; CREATE TABLE t( x INT, ) WITH SYSTEM VERSIONING; ● Таблица может поддерживать версионирование: ● Колонки для версий можно объявить явно:
  • 34. 34 System-versioned tables (2) ● По-подзапросыумолчанию видны только последние данные SELECT * FROM t FOR SYSTEM_TIME AS OF TIMESTAMP'2016-10-09 08:07:06'; SELECT * FROM t; ● Можно смотреть в прошлое ● Или изучать период в прошлом: SELECT * FROM t FOR SYSTEM_TIME FROM '2016-01-01 00:00:00' TO '2017-01-01 00:00:00'; SET @@system_versioning_asof= TIMESTAMP'2016-10-09 08:07:06'
  • 35. 35 System-versioned tables (3) ● История “пишется” автоматически – Удалить нельзя ● Подоходит для – Аудита – Логирования всех действий – Возможности восстановления данных ● Еще там есть partitioning, привязка к номеру транзакции, ... ● Доступно в MariaDB 10.3
  • 36. 36 Application-time periods ● System versioning – История изменений в БД, а не той области, про которую данные – период применимости данных= время внесения изменений в БД – Редактировать историю нельзя ● Application-подзапросыtime: – Приложение в явном виде управляет start_time/end_time – Возможность вносить данные до/после события – Редактирование истории, будущего и тд.
  • 37. 37 Application-time periods ● Пример CREATE TABLE emp( emp_name VARCHAR(100), ... start_date DATE, end_date DATE, PERIOD FOR emp_period(start_date, end_date) ); – Автоматически заводит constraint, start_date<=end_date
  • 38. 38 Application-time periods (2) ● Другой синтаксис: CREATE TABLE emp( emp_name VARCHAR(100), ... start_date DATE, end_date DATE, PERIOD FOR emp_period(start_date, end_date) ); ● Даты можно указывать любые insert into emp values ('John', ..., DATE'2015-01-01', DATE'2020-12-31'); – Автоматически заводит constraint, start_date<=end_date
  • 39. 39 Application-time periods (3) ● DELETE/UPDATE поддерживают FOR PORTION OF: DELETE FROM emp FOR PORTION OF emp_period FROM DATE '2019-06-01' TO DATE '2019-07-01' WHERE emp_name='John'; ● Вносят изменение во временной диапазон SELECT * FROM emp; +----------+------------+------------+ | emp_name | start_date | end_date | +----------+------------+------------+ | John | 2015-01-01 | 2019-06-01 | | John | 2019-07-01 | 2020-12-31 | +----------+------------+------------+
  • 40. 40 Application-time periods (4) ● Битемпоральная таблица – таблица с system versioning и с application time period одновременно.
  • 42. 42 Authentication в MariaDB 10.4 ● Несколько authentication plugins для каждого пользователя ● root@localhost может использовать unix socket plugin – Пользователю root пароль не будет нужен – Остальных не пустят – => Нету беспарольного root@localhost после установки (и debian-подзапросыsys-подзапросыmaint тоже) ● Изменения в системных таблицах – mysql.user -подзапросы> mysql.global_priv ● Истечение паролей
  • 44. 44 Выводы – MariaDB 10.4 ● Оптимизатор – optimizer trace – улучшенные гистограммы – улучшенный Condition pushdown ● InnoDB – больше покрытие мгновенных ALTER TABLE ● Galera 4 ● Application time for system-подзапросыversioned tables ● и много чего еще!