GA

2014/04/15

MroongaのラッパーモードでInnoDBを使う落とし穴

Mroonga(ストレージモード)はトランザクション非対応だから、ラッパーモードでInnoDBにしてトランザクション…とか考えているとハマる(かもしれない)落とし穴。

Mroongaのラッパーモードは「データは任意のストレージエンジンに」「転置索引はGroonga上に」作るモードであって、飽くまでGroonga上ではトランザクションは利きません。つまり、こういうことが起こる。


mysql56> CREATE TABLE t1 (num int, val varchar(32), primary key(num), fulltext key(val)) Engine= Mroonga COMMENT= 'engine "innodb"';
Query OK, 0 rows affected (0.09 sec)

mysql56> INSERT INTO t1 VALUES (1, 'yoku0825');
Query OK, 1 row affected (0.01 sec)

mysql56> SELECT * FROM t1;
+-----+----------+
| num | val      |
+-----+----------+
|   1 | yoku0825 |
+-----+----------+
1 row in set (0.01 sec)

mysql56> SELECT * FROM t1 WHERE match(val) against('yoku');
+-----+----------+
| num | val      |
+-----+----------+
|   1 | yoku0825 |
+-----+----------+
1 row in set (0.00 sec)

mysql56> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)

mysql56> UPDATE t1 SET val= 'updated' WHERE num= 1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql56> SELECT * FROM t1;
+-----+---------+
| num | val     |
+-----+---------+
|   1 | updated |
+-----+---------+
1 row in set (0.00 sec)

mysql56> SELECT * FROM t1 WHERE match(val) against('yoku');
Empty set (0.00 sec)

mysql56> SELECT * FROM t1 WHERE match(val) against('update');
+-----+---------+
| num | val     |
+-----+---------+
|   1 | updated |
+-----+---------+
1 row in set (0.00 sec)

mysql56> ROLLBACK;
Query OK, 0 rows affected (0.01 sec)

mysql56> SELECT * FROM t1;
+-----+----------+
| num | val      |
+-----+----------+
|   1 | yoku0825 |
+-----+----------+
1 row in set (0.00 sec)

mysql56> SELECT * FROM t1 WHERE match(val) against('yoku');
Empty set (0.00 sec)

mysql56> SELECT * FROM t1 WHERE match(val) against('update');
+-----+----------+
| num | val      |
+-----+----------+
|   1 | yoku0825 |
+-----+----------+
1 row in set (0.00 sec)

飽くまで転置索引は既に更新されていて、ROLLBACKが利くのは「データの格納されているInnoDB部分」だけ。この状態を解消するには、転置索引を作り直してやるしかない(と思う)

mysql56> ALTER TABLE t1 DISABLE KEYS;
Query OK, 0 rows affected (0.00 sec)

mysql56> ALTER TABLE t1 ENABLE KEYS;
Query OK, 0 rows affected (0.06 sec)

mysql56> SELECT * FROM t1 WHERE match(val) against('yoku');
+-----+----------+
| num | val      |
+-----+----------+
|   1 | yoku0825 |
+-----+----------+
1 row in set (0.01 sec)

mysql56> SELECT * FROM t1 WHERE match(val) against('update');
Empty set (0.00 sec)

飽くまで「こういうもの」として考えておかないと、ヒットする/しないがシビアなところだと失敗するかも知れません。基本的に俺はストレージモード推しです。

なお、「(パラメーターによるけど)InnoDBのトランザクション機能でデータ部分は保護される」のは事実なので、クラッシュしてGroonga部分が壊れても(ストレージモードだとここでバックアップからリストアコース)データ部分はリストアする必要がなく、転置索引さえ再作成すればOK、というのはありますね。転置索引に比べてデータ部分が十分大きい場合には、リカバリーの時間短縮と考えられるかも知れません(ちゃんと計ってない)

誰か計ったら教えてください :)


【2014/04/16 10:16】
中の人が教えてくだれました :)



ありがとうございます。

MySQLをプロファイる(仮) at MyNA(日本MySQLユーザ会)会 2014年4月

過日のMyNA会でしゃべってきました。



本人の中では、前回のOSC 2014 Tokyo/Springのネタが導入編、今回がじゃあ実際にどんなの使ってやってるよ? という入門編なイメージです。
 ⇒ 日々の覚書: MySQLのパラメーターチューニング at OSC 2014 Tokyo/Spring

誰も手を挙げてはいただけなかったですけど、大なり小なりスクリプトとか色々書いてる人はいるだろうなぁと想像してます。俺もへなちょこPerlでちまちま書いてたりしますし(innotopでステータス変数の差分取るカスタマイズを調べるのが面倒だったので、自分でスクラッチしたとか)


さて、話は変わってポエミーな感じ。

ATNDのページにもでかでかと書いていただきましたが、先月、Oracle ACEに認定いただくことができました。今回のMyNA会は「yokuさんお祝いに勉強会やろう! でもRonaldの都合があるからこの日かこの日ね。yokuさんの都合は別に聞いてない」という某氏の掛け声で開催していただきました。

会場を提供いただいた LINE株式会社 さん、会場提供に全面的にご協力いただいた @studio3104 さん、月曜日の夕刻にも関わらず足を運んでくれたみなさま、本当にありがとうございました。あんなに祝福の言葉をいただいて写真を撮っていただいたのは結婚式以来です。本当に幸せでした(とか書くと死にそう)

○racle様の認定プロセスを通れるくらいモノ(Slideshareのスライド、ブログの記事)が色々残せたのは本当に、中の人のMySQLチームのみなさまと 日本MySQLユーザ会 のみなさまとのご縁が大きいと本当に本当に思っています。

名前を挙げたらきりがないくらい(というか、本当にきりがなかったので途中まで書いて消した)のたくさんの人にお世話になっていますし、細かいことはさておいて色々いじって遊んで人と話せるMySQLが大好きです。

不束者ですが、これからもよろしくお願いいたします。


と、コレだけじゃアレなので、最後にOracle ACE認定のアレな話をおいていきますね :)



2014/04/07

MySQL 5.6.17のinnodb_metricsを有効にしてみる

MySQL 5.6から加わった INFORMATION_SCHEMA.INNODB_METRICS のテスト。

mysql56> SELECT name, subsystem, count, status FROM information_schema.innodb_metrics;
+------------------------------------------+---------------------+-----------+----------+
| name                                     | subsystem           | count     | status   |
+------------------------------------------+---------------------+-----------+----------+
| metadata_table_handles_opened            | metadata            |         0 | disabled |
| metadata_table_handles_closed            | metadata            |         0 | disabled |
| metadata_table_reference_count           | metadata            |         0 | disabled |
| metadata_mem_pool_size                   | metadata            |   8388608 | enabled  |
| lock_deadlocks                           | lock                |         0 | enabled  |
| lock_timeouts                            | lock                |         0 | enabled  |
..
| icp_no_match                             | icp                 |         0 | disabled |
| icp_out_of_range                         | icp                 |         0 | disabled |
| icp_match                                | icp                 |         0 | disabled |
+------------------------------------------+---------------------+-----------+----------+
214 rows in set (0.32 sec)

全部で214もの項目があり、17のサブシステムに分けられていて、それぞれdisabled, enabledが指定できる。
今までSHOW ENGINE INNODB STATUS(InnoDB Monitor)でしか取れなかったような情報や、載っていない情報もぽちぽち取れたりするので、可能なら全enabledにしておきたい所存。

enableの仕方はSET GLOBAL innodb_monitor_enable= で設定する。INFORMATION_SCHEMAなので、performance_schemaみたいに UPDATE information_schema.innodb_metrics SET status= 'enabled'というわけには *いかない*。

mysql56> UPDATE information_schema.innodb_metrics SET status= 'enabled' WHERE subsystem= 'metadata';
ERROR 1044 (42000): Access denied for user 'root'@'localhost' to database 'information_schema'

mysql56> SET GLOBAL innodb_monitor_enable= icp_out_of_range;
Query OK, 0 rows affected (0.00 sec)

mysql56> SET GLOBAL innodb_monitor_enable= module_metadata;
Query OK, 0 rows affected (0.13 sec)

mysql56> SELECT name, subsystem, count, status FROM information_schema.innodb_metrics;
+------------------------------------------+---------------------+-----------+----------+
| name                                     | subsystem           | count     | status   |
+------------------------------------------+---------------------+-----------+----------+
| metadata_table_handles_opened            | metadata            |         0 | enabled  |
| metadata_table_handles_closed            | metadata            |         0 | enabled  |
| metadata_table_reference_count           | metadata            |         0 | enabled  |
| metadata_mem_pool_size                   | metadata            |   8388608 | enabled  |
| lock_deadlocks                           | lock                |         0 | enabled  |
| lock_timeouts                            | lock                |         0 | enabled  |
..
| icp_no_match                             | icp                 |         0 | disabled |
| icp_out_of_range                         | icp                 |         0 | enabled  |
| icp_match                                | icp                 |         0 | disabled |
+------------------------------------------+---------------------+-----------+----------+
214 rows in set (0.19 sec)

イメージ的な"WHERE subsystem= 'xx'"にあたるのがinnodb_monitor_enable= module_xx で、イメージ的な"WHERE name= 'yy'"にあたるのがinnodb_monitor_enable= yyになる。全部いっぺんにenabledにするにはinnodb_monitor_enable= allだし、%記号を使ってワイルドカード指定もできる様子。
無効化するには、SET GLOBAL innodb_monitor_disable= ..で、指定の仕方はenableの時といっしょ。

で、問題はこれがどれくらい性能劣化を引き起こすか。

取りあえずざっくりtpcc_load WH= 1(INSERTのみのワークロードで、1スレッドしかなく、データはすべてバッファプールに収まるサイズ)で試してみる。


$ time ./tpcc_load localhost tpcc root "" 1 > /dev/null

【innodb_monitor何もいじらない】
real    1m22.414s
user    0m9.885s
sys     0m4.890s

real    1m23.739s
user    0m9.927s
sys     0m5.046s

real    1m23.227s
user    0m10.031s
sys     0m4.877s


【SET GLOBAL innodb_monitor_enable= all】
real    1m21.462s
user    0m9.690s
sys     0m4.939s

real    1m21.057s
user    0m9.781s
sys     0m4.803s<

real    1m22.970s
user    0m9.939s
sys     0m5.069s


【SET GLOBAL innodb_monitor_disable= all】
real    1m23.818s
user    0m9.949s
sys     0m4.990s

real    1m19.556s
user    0m9.386s
sys     0m4.844s

real    1m21.829s
user    0m9.824s
sys     0m4.904s

よさげ。 ちゃんとtpcc_startでもオーバーヘッドはからないとだけど、取りあえずmy.cnfにinnodb_monitor_enable= allで全部ONにしちゃおうかなと思いつつ(オンラインで変えられるし)

2014/03/18

MySQL 5.6への移行でmysqldumpを使わなかったらどうなるか

MySQL 5.6へのアップグレードはmysqldump推奨 なんですが、それを無視してmysql_upgradeでアップデートできないものかと考える。というか、深遠な理由でmysql_upgradeでアップグレードしたMySQLが正に目の前にある。


【2014/03/19 11:13修正】

1) performance_schemaが使えない

5.5のperformance_schemaと5.6のperformance_schemaはテーブル構造が盛大に違うので、mysqldを起動させることはできるが盛大にエラーを吐く。performance_schemaにアクセスしようとするとクエリーがエラーになる。

mysqlスキーマの構造が違うのはmysql_upgradeがよしなにしてくれる(ので、InnoDB統計情報永続化とか、relay_log_info_repository= TABLEは使える)が、performance_schemaに関してはノータッチなのでこうなる。

【2014/03/19 11:27修正】

少なくとも5.6.16ではmysql_upgradeがよしなにやってくれているぽい。5.6.13で失敗したことがあったので 差を見てみると、scripts/mysql_fix_privilege_tables.sql というファイルが増えているので、ここかも知れない。ただ、5.6.13にも5.6.16にも scripts/mysql_system_tables.sql というのがあって、こっちでも同じようなことしてるっぽいんだよなぁ。。すいません。 そう思い込んでいたのかと。。ダメだ。。

ちなみに、5.6のmysql_install_dbをテキトーなディレクトリに向かって放ったあと、datadir/performance_schema をまるっとコピーして再起動したら直った(使えるようになった)が、これで本当に直ってるのか(他に影響が出ていないか)どうかは俺は知らない。。

2) TIMESTAMP, DATETIME型の方データ構造が微妙に変わっている

少なくともリファレンスマニュアル上でmysqldumpを推奨している理由についてリストアップされているのがこれ。マイクロ秒対応とかエンディアンが変わったとかパディング方式が変わったとか色々あるけれど、ただ使う分には問題なさげに動く。

例外は、「マスターはmysql_upgradeでアップグレードしたけど、スレーブはmysqldumpからリストアして構築した」もしくは「マスターはmysqldumpでアップグレードしたけど、スレーブはmysql_upgradeでアップグレードした」、かつ「バイナリーログがROWモードで記録された」場合。

これだと、マスターで記録された型情報とスレーブで再生されようとする型情報に不整合が発生するので、

mysql56> SHOW SLAVE STATUS\G
..
    Last_SQL_Errno: 1677
    Last_SQL_Error: Column 0 of table 'd1.t2' cannot be converted from type 'datetime' to type 'datetime'
..

こんな訳のわからない(datetime型からdatetime型への変換に失敗した)エラーでSQLスレッドが転ける。STATEMENTモードでは影響を受けないが、binlog_format= MIXEDでROWモードにフォールバックするようなクエリーが流れているとこれの直撃を食らう。

これは憶えておいた方がいいかも。

2014/03/04

Mroongaのテーブルからノイズになるトークンを(手で)取り除いてみる

データは 日々の覚書: 全文検索のテスト用にtweets.csvを食わせるSQL で書いた、わたしのツイートをテーブルに突っ込んだもので試してみました。

トークナイザーとノーマライザーはデフォルトのTokenBigram, NormalizerMySQLGeneralCIにそれぞれなっています。

$ /usr/groonga/4.0.0/bin/groonga /usr/mysql/5.6.16/data/mroonga.mrn
> table_list --output_type tsv
0       1393927353.03097        0.000258684158325195
"id"    "UInt32"
"name"  "ShortText"
"path"  "ShortText"
"flags" "ShortText"
"domain"        "ShortText"
"range" "ShortText"
"default_tokenizer"     "ShortText"
"normalizer"    "ShortText"
259
"tweets"
"/usr/mysql/5.6.16/data/mroonga.mrn.0000103"
"TABLE_PAT_KEY|PERSISTENT"
"UInt64"



263
"tweets-text"
"/usr/mysql/5.6.16/data/mroonga.mrn.0000107"
"TABLE_PAT_KEY|PERSISTENT"
"ShortText"

"TokenBigram"
"NormalizerMySQLGeneralCI"
END

たぶん中の人には嫌われるでしょうが、わたしは--output_type tsv好きですよ :)
では早速トークンを覗き込んでみる。

> select tweets-text --output_type tsv
0       1393927720.5169 0.000890493392944336
51762
[       "_id"   "UInt32"        ]       [       "_key"  "ShortText"     ]       [       "index" "tweets"        ]
26653   "\t"    45
44250   "\tな"  1
15055   "\tを"  1
4       "\n"    944
3       "\n\n"  945
11621   "\nあ"  60
3101    "\nい"  23
14566   "\nう"  21
5776    "\nえ"  1
11625   "\nお"  77
END

いかにもノイズっぽいのがいっぱいありますね!
あ、"index" "tweets"のカラム(3カラム目の、数字が並んでるやつ)は、そのトークンを持ってるレコードの数とかじゃないのでご注意を。

もとの速度は

mysql56> pager cat > /dev/null
PAGER set to 'cat > /dev/null'

mysql56> SELECT * FROM tweets WHERE MATCH(text) AGAINST ('+MySQL' IN BOOLEAN MODE);
2778 rows in set (0.02 sec)

mysql56> nopager
PAGER set to stdout

mysql56> SHOW PROFILE;
+--------------------------------+----------+
| Status                         | Duration |
+--------------------------------+----------+
| starting                       | 0.000055 |
| Waiting for query cache lock   | 0.000007 |
| init                           | 0.000006 |
| checking query cache for query | 0.000131 |
| checking permissions           | 0.000016 |
| Opening tables                 | 0.000115 |
| init                           | 0.000084 |
| System lock                    | 0.000030 |
| optimizing                     | 0.000019 |
| statistics                     | 0.000663 |
| preparing                      | 0.000036 |
| FULLTEXT initialization        | 0.003164 |
| executing                      | 0.000021 |
| Sending data                   | 0.019530 |
| end                            | 0.000027 |
| query end                      | 0.000012 |
| closing tables                 | 0.000177 |
| freeing items                  | 0.003743 |
| cleaning up                    | 0.000056 |
+--------------------------------+----------+
19 rows in set, 1 warning (0.00 sec)

まあこんなもんとしておきます。

$ /usr/groonga/4.0.0/bin/groonga /usr/mysql/5.6.16/data/mroonga.mrn "select tweets-text --output_type tsv --limit -1" | perl -nlae 'if (@F[1] =~ /\\/) {my $cmd= sprintf("/usr/groonga/4.0.0/bin/groonga /usr/mysql/5.6.16/data/mroonga.mrn \"delete tweets-text --output_type tsv --filter \\\"_id== %d\\\"\"", @F[0]); system($cmd);}'
..

とまあ、要らなさそうなトークンを選んで消していきます。他にも記号だけで構成されたトークンとかいろいろゴニョゴニョがんばって消してみました。どうか。

mysql56> pager cat > /dev/null
PAGER set to 'cat > /dev/null'

mysql56> SELECT * FROM tweets WHERE MATCH(text) AGAINST ('+MySQL' IN BOOLEAN MODE);
2778 rows in set (0.03 sec)

mysql56> nopager
PAGER set to stdout

mysql56> SHOW PROFILE;
+--------------------------------+----------+
| Status                         | Duration |
+--------------------------------+----------+
| starting                       | 0.000045 |
| Waiting for query cache lock   | 0.000009 |
| init                           | 0.000006 |
| checking query cache for query | 0.000099 |
| checking permissions           | 0.000012 |
| Opening tables                 | 0.000119 |
| init                           | 0.000054 |
| System lock                    | 0.000019 |
| optimizing                     | 0.000022 |
| statistics                     | 0.000623 |
| preparing                      | 0.000033 |
| FULLTEXT initialization        | 0.003134 |
| executing                      | 0.000018 |
| Sending data                   | 0.019653 |
| end                            | 0.000038 |
| query end                      | 0.000012 |
| closing tables                 | 0.000199 |
| freeing items                  | 0.002571 |
| cleaning up                    | 0.000047 |
+--------------------------------+----------+
19 rows in set, 1 warning (0.00 sec)

うん、誤差!
プロファイルのDurationを足し合わせると2回目の方がほんの少し小さいのに、"2778 rows in set"のあとの数字は2回目の方が大きいふしぎ!

そこはそれとして、さらに、アルファベットのみで構成されたトークン以外を全部消してみた。

mysql56> pager cat > /dev/null
PAGER set to 'cat > /dev/null'

mysql56> SELECT * FROM tweets WHERE MATCH(text) AGAINST ('+MySQL' IN BOOLEAN MODE);
2778 rows in set (0.02 sec)

mysql56> nopager
PAGER set to stdout

mysql56> SHOW PROFILE;
+--------------------------------+----------+
| Status                         | Duration |
+--------------------------------+----------+
| starting                       | 0.000050 |
| Waiting for query cache lock   | 0.000006 |
| init                           | 0.000007 |
| checking query cache for query | 0.000104 |
| checking permissions           | 0.000013 |
| Opening tables                 | 0.000055 |
| init                           | 0.000055 |
| System lock                    | 0.000021 |
| optimizing                     | 0.000018 |
| statistics                     | 0.000387 |
| preparing                      | 0.000032 |
| FULLTEXT initialization        | 0.002243 |
| executing                      | 0.000021 |
| Sending data                   | 0.018932 |
| end                            | 0.000027 |
| query end                      | 0.000012 |
| closing tables                 | 0.000175 |
| freeing items                  | 0.003542 |
| cleaning up                    | 0.000046 |
+--------------------------------+----------+
19 rows in set, 1 warning (0.00 sec)

プロファイルのDurationの合計、もともと 27.892ms, ノイズ削除 26.713ms, アルファベット以外全部削除 25.746ms。

結論、効果はあるんだろうけど(少なくとも16000レコードちょっと、51000トークン程度では)わざわざやる必要なし。

本番データで試したくなってきました。

information_schemaでちょこちょこ使えるTIPS

ちょこちょこ使うi_s関連のSELECTステートメント。
やる前にSET GLOBAL innodb_stats_on_metadata= 0; しておかないと重くなる。

  • xxxってカラム、どのテーブルにあるんだっけ?
mysql56> SELECT CONCAT(table_schema, '.', table_name) AS object, column_type FROM columns WHERE column_name= ? ORDER BY 1, 2;

  • データベース上のINDEXの一覧がほしい。
mysql56> SELECT CONCAT(table_schema, '.', table_name) AS object, index_name, GROUP_CONCAT(column_name ORDER BY seq_in_index) AS columns FROM statistics WHERE table_schema NOT IN ('mysql', 'information_schema', 'performance_schema') GROUP BY 1, 2;

  • フルテキストインデックスどこだっけ?
mysql56> SELECT CONCAT(table_schema, '.', table_name) AS object, index_name, GROUP_CONCAT(column_name ORDER BY seq_in_index) AS columns FROM statistics WHERE table_schema NOT IN ('mysql', 'information_schema', 'performance_schema') AND index_type= 'FULLTEXT' GROUP BY 1, 2;

  • パーティションの一覧と、入っている件数がほしい。
    • partition_name IS NOT NULLをはずすと、パーティショニングされてないテーブルも出力できる。
mysql56> SELECT CONCAT(table_schema, '.', table_name) AS object, partition_name, table_rows FROM partitions WHERE table_schema NOT IN ('mysql', 'information_schema', 'performance_schema') AND partition_name IS NOT NULL ORDER BY 1, 2;

  • PARTITION .. LESS THAN MAXVALUEなパーティションに今入っている件数をチェック。
mysql56> SELECT CONCAT(table_schema, '.', table_name) AS object, partition_name, table_rows FROM partitions WHERE partition_description= 'MAXVALUE' ORDER BY 1, 2;

  • InnoDBバッファプールにどのテーブルのデータがどれくらい載ってるか知りたい。
    • table_name, index_nameがNULLのは空きページ。
mysql56> SELECT table_name, index_name, SUM(number_records) AS record, SUM(data_size) AS datasize FROM innodb_buffer_page GROUP BY 1, 2;

  • テーブルごと、スキーマごと、エンジンごとのデータサイズを一発で。
mysql56> SELECT engine, table_schema, table_name, SUM(data_length+ index_length) AS size FROM tables WHERE table_schema NOT IN ('mysql', 'information_schema', 'performance_schema') GROUP BY 1, 2, 3 WITH ROLLUP;

mysql56> SELECT name, count, status FROM innodb_metrics;


InnoDBのロック競合を解析するアレはご本家をどうぞ。
 ⇒ MySQL InnoDBにおけるロック競合の解析手順 - SH2の日記


【2014/03/05 18:41】
1箇所ANDが抜けてた…(´・ω・`)

2014/03/02

MySQLのパラメーターチューニング at OSC 2014 Tokyo/Spring

去る2014/03/01(土)の OSC 2014 Tokyo/Spring でMyNAとしてセミナーの枠をいただいたので、おはなしししてきました。

雨の中たくさんの方に足を運んでいただきました。本当にどうもありがとうございました。



"MySQLパラメーターチューニングの理屈と定石"と銘打って、普段アプリを書いているような人向けに、俺が普段やってるパラメーターチューニングと同じくらいのことが誰にでもできるように…とか思って資料を作っていたんですが(社内のDB勉強会に使うネタのうち、パラメーター調整の部分だけを切り出した、というのがもともとのコンセプトです)、作れば作るほど、いかに自分が「考えるな。感じるんだ」でチューニングしているのかをむしろ思い知らされました。

「これとこれ見るでしょ? そうするとなんか変な感じがするじゃない? で、こことここだからこれかなって。いじってみたら違うから、近いパラメーターいじってみったら上手くいった」 みたいな。更に言うなら、パラメーターだけいじることなんて運用フェーズに入ればそんなになくて、「このSQLのネックはこことここのはずで、こっちはSQL書き換えて回避できるけどもう片方はすぐにはできなさそうだから、パラメーターで誤魔化しておく」とかフツーにあるわけですよ。

そうやってあたりをつけながら切り分けて、最適…とまではいかなくともまあまあな状態にチューニングするんですが、これを体系立てて説明する…? とか、正直スキルが足りなさすぎました_| ̄|○

「これだけ設定しておけば間違いない!」みたいなのを紹介したかったし、期待されていたと思うんですが、さりとてテキトーなことを言うわけにもいかず、innodb_buffer_pool_sizeとinnodb_log_file_size* innodb_log_files_in_groupくらいで、そんなの当然みなさんご存知ですよねごめんなさい、という風情です。

スライド中に出てきたツールとか、リンク張るの忘れてた(というか、PDFだ。。)ので、こちらにリンクだけ掲載しておきます。




どうもありがとうございました。