Вступление
Вступление
Нет!
Логическая:
Физическая:
Сильные стороны логической репликации:
Слабые стороны логической репликации:
Логическая репликация в MySQL:
Логическая репликация в MySQL:
Логическая репликация в Booking.com:
Физическая репликация в PostgreSQL:
Логическая репликация в PostgreSQL:
Полусинхронная (semi-synchronous) репликация:
synchronous_standby_names
близко по смыслу, но не то)PERFORMANCE_SCHEMA
, Pinba)
Плюсы:
Минусы:
Кластеризованные индексы в PostgreSQL:
CLUSTER
делает одноразовую реорганизациюПлюсы:
Минусы:
Стандартная таблица sysbench, 1M записей:
CREATE TABLE sbtest1 ( id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, k INTEGER UNSIGNED DEFAULT '0' NOT NULL, c CHAR(120) DEFAULT '' NOT NULL, pad CHAR(60) DEFAULT '' NOT NULL ); CREATE INDEX k_1 ON sbtest1(k);
CREATE TABLE sbtest1 ( id SERIAL NOT NULL PRIMARY KEY, k INTEGER DEFAULT '0' NOT NULL, c CHAR(120) DEFAULT '' NOT NULL, pad CHAR(60) DEFAULT '' NOT NULL ); CREATE INDEX k_1 ON sbtest1(k);
data | index | total | |
---|---|---|---|
InnoDB | 214.70 | 19.55 | 234.25 |
PostgreSQL | 211.23 | 50.10 | 261.33 |
MySQL:
PostgreSQL (TOAST):
Та же таблица (sbtest1, 1M записей)
data | index | total | |
---|---|---|---|
InnoDB | 214.70 | 19.55 | 234.25 |
PostgreSQL | 211.23 | 50.10 | 261.33 |
InnoDB, zlib | 115.38 | 10.27 | 125.65 |
innodb_page_size = 16K
(4K, 8K, 16K, 32K, 64K)OS_FILE_LOG_BLOCK_SIZE=512
BLCKSZ = 8K
XLOG_BLCKSZ = 8K
(1K, 2K, 4K, 8K, 16K, 32K, 64K)InnoDB:
PostgreSQL:
O_DIRECT
ALL_O_DIRECT
(в Percona Server, MariaDB/XtraDB)O_DIRECT
O_DIRECT
в PostgreSQL:
XLOG_BLCKSZ=8
write amplification взлетает до небесshared_buffers
= ~25% RAM)O_DIRECT
MySQL:
PostgreSQL:
O_DIRECT
Отсутствуют в PostgreSQL:
Intel® Xeon® E7-5880 v4/v3, 4 x 18 ядер, key/value запросы (SELECT... WHERE pk=const
)
MySQL (источник: блог Дмитрия Кравчука)
PostgreSQL:
fork()/clone()
– быстрая операция в Linuxpthread_create()
sysbench, connect test, Linux, Xeon E5-2683v4:
connect/disconnect time, ms | |
---|---|
MySQL 5.7.13 с thread cache | 0.20 |
MySQL 5.7.13 без thread cache | 0.40 |
PostgreSQL 9.5.3 | 3.73 |
MyRocks и TokuDB:
NDB:
MySQL + NDB:
Типичные области применения:
DISTINCT
и GROUP BY
запросовCREATE TABLE t1m10cp(a int, b int); CREATE INDEX t1m10cp_ab on t1m10cp(a,b); SELECT MIN(b) FROM t1m10cp GROUP BY a;
mysql> explain select min(b) from t1m10cp group by a\G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: t1m10cp partitions: NULL type: range possible_keys: t1m10cp_ab key: t1m10cp_ab key_len: 10 ref: NULL rows: 11 filtered: 100.00 Extra: Using index for group-by mysql> select min(b) from t1m10cp group by a; +--------+ | min(b) | +--------+ . . . +--------+ 11 rows in set (0.00 sec)
PostgreSQL:
sbtest=# explain select min(b) from t1m10cp group by a; QUERY PLAN ----------------------------------------------------------------------- HashAggregate (cost=21370.00..21370.11 rows=11 width=8) Group Key: a -> Seq Scan on t1m10cp (cost=0.00..16370.00 rows=1000000 width=8) sbtest=# select min(b) from t1m10cp group by a; min ----- . . . (11 rows) Time: 282.493 ms
> в 56 раз медленнее, чем в MySQL
Пример коррелированного подзапроса:
create table t10 (a int, b int); insert into t10 select a, 1 from ten; select count(*) from t1m10cp where pk in (select b from t10 where t10.a=t1m10cp.a);
MySQL:
mysql> select count(*) from t1m10cp where pk in (select b from t10 where t10.a=t1m10cp.a); +----------+ | count(*) | +----------+ | 0 | +----------+ 1 row in set (0.00 sec)
MySQL: DuplicateWeedout стратегия
*************************** 1. row *************************** id: 1 select_type: SIMPLE table: t10 partitions: NULL type: ALL key: NULL rows: 10 filtered: 100.00 Extra: Using where; Start temporary *************************** 2. row *************************** id: 1 select_type: SIMPLE table: t1m10cp partitions: NULL type: eq_ref key: PRIMARY key_len: 4 ref: sbtest.t10.b rows: 1 filtered: 10.00 Extra: Using where; End temporary
PostgreSQL: «наивное» вычисление подзапроса
sbtest=# explain analyze select count(*) from t1m10cp where pk in (select b from t10 where t10.a=t1m10cp.a); QUERY PLAN ------------------------------------------------------------------------------------ Aggregate (cost=583870.00..583870.01 rows=1 width=0) (actual time=1716.412..1716.412 rows=1 loops=1) -> Seq Scan on t1m10cp (cost=0.00..582620.00 rows=500000 width=0) (actual time=1716.411..1716.411 rows=0 loops=1) Filter: (SubPlan 1) Rows Removed by Filter: 1000000 SubPlan 1 -> Seq Scan on t10 (cost=0.00..1.12 rows=1 width=4) (actual time=0.001..0.001 rows=1 loops=1000000) Filter: (a = t1m10cp.a) Rows Removed by Filter: 9 Planning time: 0.064 ms Execution time: 1716.439 ms (10 rows)
> в 343 раза медленнее, чем в MySQL
MySQL:
USE INDEX FOR [FOR {JOIN|ORDER BY|GROUP BY}]
IGNORE INDEX [FOR {JOIN|ORDER BY|GROUP BY}]
FORCE INDEX [FOR {JOIN|ORDER BY|GROUP BY}]
MAX_EXECUTION_TIME
, BKA
, MRR
, NO_ICP
,
NO_RANGE_OPTIMIZATION
, SEMIJOIN
, SUBQUERY
PostgreSQL:
SET optimizer_trace="enabled=on"; SELECT ...; # your query here SELECT * FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE; ... { "transformation": { "select#": 2, "from": "IN (SELECT)", "to": "semijoin", "chosen": true, "evaluating_constant_semijoin_conditions": [ ] } },
MySQL | PostgreSQL | комментарий | |
---|---|---|---|
? | наследование таблиц | встроенное, trigger-based, RANGE , LIST , недекларативное, ручное управление, проблемы с большим кол-вом секций |
|
2008 | декларативное, 5.1 | встроенное, RANGE , LIST , COLUMNS , KEY , HASH , вложенное, … |
|
2012 | pg_partman |
внешнее, наследование, но с автоматизация ручной работы, только time и serial ranges | |
2016 | pg_pathman |
внешнее, (beta?), недекларативное | |
??? | декларативное | встроенное, 9.7? |
Сравнение возможностей утилит физического резервного копирования:
Percona XtraBackup | pg_basebackup |
barman | pg_arman |
pgBackRest | |
---|---|---|---|---|---|
полные | ✔ | ✔ | ✔ | ✔ | ✔ |
кросс-платформенные | ✔ | ||||
инкрементальные | ✔ | ✔¹ | ✔² | ✔¹ | |
частичные | ✔ | ✔ | |||
потоковые | ✔ | ✔ | |||
параллельные | ✔ | ✔ | |||
сжатые | ✔ | ✔³ | ✔ | ||
"компактные" | ✔ | ||||
зашифрованные | ✔ | ||||
облачные | ✔ |
¹ – очень ограниченно и медленно (file-level)
² – на основе WAL файлов
³ – данные сжимаются после передачи
PERFORMANCE_SCHEMA
pg_stat_*
Планировщик заданий
MySQL:
PostgreSQL:
Сэкономить время на:
MySQL:
PostgreSQL:
pg_hba.conf
)Когда PostgreSQL завоюет мир?
PostgreSQL есть чему поучиться у других популярных СУБД
И PostgreSQL учится!
Вопросы, комментарии, истории?