17. MySQLの最近のバージョンおさらい
date version description
2008/11/14 5.1.30 MySQL 5.1 GA
2010/12/03 5.5.8 MySQL 5.5 GA
2011/04/11 5.6.2-m15 MySQL 5.6最初のDMR
2013/02/05 5.6.10 MySQL 5.6 GA
2013/04/23 5.7.1-m11 MySQL 5.7最初のDMR
2013/12/03 5.1.73 MySQL 5.1 最後のリリース
2015/10/21 5.7.9 MySQL 5.7 GA
2015/12/07 5.5.47 MySQL 5.5 (たぶん)最後の
リリース
16/104
54. GTIDのローリング有効化ステートメント
slave> SET GLOBAL gtid_mode= OFF_PERMISSIVE;
master> SET GLOBAL gtid_mode= OFF_PERMISSIVE;
slave> SET GLOBAL gtid_mode= ON_PERMISSIVE;
master> SET GLOBAL gtid_mode= ON_PERMISSIVE;
slave> SET GLOBAL enforce_gtid_consistency= ON;
master> SET GLOBAL enforce_gtid_consistency= ON;
slave> SET GLOBAL gtid_mode= ON;
master> SET GLOBAL gtid_mode= ON;
53/104
74. 範囲検索でORDER BYまでキーが使えないやつも
mysql> ALTER TABLE Country ADD KEY (population, gnp);
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> explain SELECT Name FROM Country WHERE Population > 100000000 ORD
ER BY GNP DESC;
+----+-------------+---------+------------+-------+---------------+-----
-------+---------+------+------+----------+-----------------------------
----------+
| id | select_type | table | partitions | type | possible_keys | ke
y | key_len | ref | rows | filtered | Extr
a |
+----+-------------+---------+------------+-------+---------------+-----
-------+---------+------+------+----------+-----------------------------
----------+
| 1 | SIMPLE | Country | NULL | range | Population | Popu
lation | 4 | NULL | 10 | 100.00 | Using index condition; Usin
g filesort |
+----+-------------+---------+------------+-------+---------------+-----
-------+---------+------+------+----------+-----------------------------
----------+
1 row in set, 1 warning (0.00 sec)
73/104
75. generated columnならこの通り
mysql> ALTER TABLE Country ADD is_over_100mil tinyint AS (IF(Population > 100000
00, 1, 0)), ADD KEY (is_over_100mil, GNP);
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> explain SELECT Name FROM Country WHERE is_over_100mil = 1 ORDER BY GNP DE
SC;
+----+-------------+---------+------------+------+----------------+-------------
---+---------+-------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | ke
y | key_len | ref | rows | filtered | Extra |
+----+-------------+---------+------------+------+----------------+-------------
---+---------+-------+------+----------+-------------+
| 1 | SIMPLE | Country | NULL | ref | is_over_100mil | is_over_100m
il | 2 | const | 78 | 100.00 | Using where |
+----+-------------+---------+------------+------+----------------+-------------
---+---------+-------+------+----------+-------------+
1 row in set, 1 warning (0.00 sec)
74/104
76. 昇順と降順が混じったソートも
mysql> ALTER TABLE Country ADD KEY (is_over_100mil, GNP, GNPOld);
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> explain SELECT Name FROM Country USE INDEX(is_over_100mil_2) WHERE is_ove
r_100mil = 1 ORDER BY GNP ASC, GNPOld DESC LIMIT 1;
+----+-------------+---------+------------+------+------------------+-----------
-------+---------+-------+------+----------+-----------------------------+
| id | select_type | table | partitions | type | possible_keys | ke
y | key_len | ref | rows | filtered | Extr
a |
+----+-------------+---------+------------+------+------------------+-----------
-------+---------+-------+------+----------+-----------------------------+
| 1 | SIMPLE | Country | NULL | ref | is_over_100mil_2 | is_over_10
0mil_2 | 2 | const | 78 | 100.00 | Using where; Using filesort |
+----+-------------+---------+------------+------+------------------+-----------
-------+---------+-------+------+----------+-----------------------------+
1 row in set, 1 warning (0.00 sec)
75/104
77. generated columnならこの通り
mysql> ALTER TABLE Country ADD invert_gnpold float(10, 2) AS (0 - GNPOld), ADD K
EY (is_over_100mil, GNP, invert_gnpold);
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> explain SELECT Name FROM Country WHERE is_over_100mil = 1 ORDER BY GNP AS
C, invert_gnpold ASC LIMIT 1;
+----+-------------+---------+------------+------+------------------------------
--------------------+------------------+---------+-------+------+----------+----
---------+
| id | select_type | table | partitions | type | possible_key
s | key | key_len | ref | row
s | filtered | Extra |
+----+-------------+---------+------------+------+------------------------------
--------------------+------------------+---------+-------+------+----------+----
---------+
| 1 | SIMPLE | Country | NULL | ref | is_over_100mil,is_over_100mil
_2,is_over_100mil_3 | is_over_100mil_3 | 2 | const | 78 | 100.00 | Usi
ng where |
+----+-------------+---------+------------+------+------------------------------
--------------------+------------------+---------+-------+------+----------+----
---------+
1 row in set, 1 warning (0.00 sec)
76/104
78. MySQLにないCHECK制約もgenerated columnならこ
の通り
mysql> ALTER TABLE Country ADD v_check tinyint AS (IF(GNPOld < 10
00, NULL, 1)) NOT NULL;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> INSERT INTO Country SET Name= 'Dummy', GNPOld= 0.01;
ERROR 1048 (23000): Column 'v_check' cannot be null
mysql> INSERT INTO Country SET Name= 'Dummy', GNPOld= 1000.01;
Query OK, 1 row affected (0.00 sec)
77/104
99. Before MySQL Router
アプリケーションの “向き先管理” は MySQL Fabric対応コ
ネクターに全⾯依存
MySQL Connector/Python-
MySQL Connector/J-
MySQL Connector/.NET-
ねえ、PHPは? Rubyは? Perl ううんなんでもない-
MySQL Fabricサーバーが落ちてもクライアントがキャッシ
ュしてくれるから運⽤継続できる?
Connector/Cは再接続できなかったよ-
都度接続モデルだとキャッシュしてようが、インスタン
ス壊しちゃうので相性が悪い
-
98/104
100. After MySQL Router
アプリケーションの “向き先管理” は MySQL Router
コネクターが何であれMySQLプロトコルをしゃべれれば
それでOK
-
mysqlrouterデーモンが⽣き続けるからキャッシュが⽣き残
る
コンポーネントとしては1つ増える
各APサーバーに⽣やす形にするなら管理の⼿間は増える-
MySQL側の増減はMySQL Fabricで吸収できる-
CentOS 6.xは⾃分でビルドしないとパッケージがない。。
99/104
101. After MySQL Router
AP1 MySQL Router
AP2 MySQL Router
MySQL Fabric Server
mysqld(backingstore)
MySQL Master MySQL Slave
MySQL Slave
Connect to 1
27.0.0.1
Connect to 1
27.0.0.1
replication
replication
100/104