3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

MySQL Casual Talks vol.10 に参加してきました

Posted at

去る02/01(水)に開催された 「MySQL Casual Talks vol.10」に参加してきました。
面白いテーマが多く、非常に楽しい勉強会でした。その中でも、自分が気になった点を
備忘録がてら、いくつかメモしておこうと思います。

※ 基本的に個人の感想なので、誤解している点などがあってもご容赦ください…

1. MySQL Casual 運営についての話 (myfinderさん)

・ MySQL Casual のSlackに外国の方向けのチャンネルを作るという話
・ 現在のメンバーの中にも日本語圏以外の人が割といる

MySQLがインターナショナルなソフトウェアであることを再認識しました。
英語用チャンネルで早速MySQLのプロダクトマネージャーである Morgan氏が
反応してくれたのがすごい。MySQL8.0 への要望とかも受け付けてるらしいです。

2. MySQLの限界に挑戦する(?!) (meijikさん)

・ MySQLの様々な限界に挑戦する話
・ めちゃくちゃ長文なクエリを実行してみたり
・ MySQLの上限を規定するのは、max_allowed_packet だけではない!
・ Linux(MySQL)の構文解析と字句解析について

過度に長文なクエリを実行すると、クエリの字句解析のフェーズでメモリを使いきってしまい、
エラーになるのが新発見でした(こんなケースそうそうないですが…)。
「クエリの解析」の場合、字句解析は独自実装だが、構文解析はbison。
また、『BNF』というを理解すれば、クエリ整形ツールやRDBそのものを開発できるようになるそうです。

3. MySQLの文字コード事情 (tmtmsさん)

・ よく話題になるMySQLの文字コードについての話
・ utf8 や cp932 は「文字コード」ではなく、「エンコーディング」
・ 世界では 「utf8」 と言ったら、「utf8mb4」のことを指すが、MySQLは「utf8 = utf8mb3」
・ utf8mb3 と utf8mb4 を区別するソフトウェアはMySQLくらいではないか
・ 「寿司=ビール問題」や、「ハハ=パパ問題」を全て解決する utf8_japanese_ci が欲しい

「character-set = 文字集合 + エンコーディング」という考え方は、今後しっかり覚えておきたい。
とりあえず、基本的には「utf8mb4」を使っておけばいいと思います。
MySQL8.0 で日本語文字コードが抱える諸問題が一気に解決することに期待。

4. Group Replication 関連 の何か (mita2さん)

・ MySQL Group Replication (= マルチライター)の基礎的な話
・ MGRのいいところは、全く同じ構成でサービス用DBをリリースできること(=金太郎飴のイメージ)
・ 運用するMySQLの台数が多くなると、従来のマスタ・スレーブ構成でもつらい
・ MGRを使う場合は、 Flow Control とか Split Brain などの機能・用語には注意すべき

MGRではSavePointがサポートされていないため、ノードに対して mysqldump --single-transaction を
実行できないのは注意したいポイントだと思いました。
「同じDB構成をリリース」というのは、いわゆるDB基盤システム的なイメージかな、と思います。
マイクロサービスで、色んなサービスをリリースしたいWeb企業とかにはフィットしそう。

5. MySQLアンチパターン (yoku0825さん)

・MySQLにおける「アンチパターン」(≒やってはいけないこと)の話
・ある程度DBの開発・運用を経験してからの方が、アンチパターンは身に染みる
 (若いころはアンチパターンと分かっていても回避できないこともある…)
・テーブルを一時変数格納用テーブルとして使ったり、JOINが遅いといって何も考えずに非正規化したり
・ER図は自動生成できるようにすると楽(=FKをしっかり貼る)
・エラーコード("0")と、取得結果0件("0")が混在したり
・MySQLの特徴(得意、不得意)をしっかり理解しよう!

実体験?に基づいた話だったので、どれも覚えておかないといけないTipsだと感じました。
基本的にダメなクエリは非正規化してもダメなので、適切なクエリの書き方を学ぶことが
一番重要だと思います。
あとは、アンチパターンを「知らずに使用する」のと、「知ったうえであえて使用する」のでは
全く内容が異なるので、まずはアンチパターンを頭に入れておきましょう。
(≒ 『SQLアンチパターン』を読みましょう)

6. zabbix+maxscale+mysqlrouter+group replication (bringer1092さん)

・本番環境のZabbixのバックエンドをHA化(+負荷分散?)する話
・当初はMaxScaleを検討していたが、使いたかったフィルタリング機能が仕様にマッチしていなかった
・代わりに採用したのがProxySQLで、フィルタが柔軟で助かる
・バックエンドのMySQLはGroup Replication(シングルプライマリモード)

実際の本番環境に Group Replication に加えて ProxySQL まで入れるとは、
かなりアグレッシブだと思いました。
MaxScale と ProxySQL は機能的には大して変わらないと思っていましたが、
細かな部分で差があるようなので、これは要検証ですね。

7. Webサービスが成長するとロックで苦労する話 (soudai1025さん)

・実体験のようなフィクションに基づいた過去の苦労話
・「闇の深いリファクタリング」や「潤沢なサーバリソースから低すぎる使用率」など、
 実際の現場で起こり得る事例が多かったです
・ロックに関する情報を見るなら、Performance_Schema便利。有効にしておきましょう

リアリティのある障害(ロック)対応の話で、勉強になりました。
ロックの情報は「現在」のものしか取らない、ということを知らない人も多いので、
情報は常に収集するようにしましょう。

8. MySQL/MariaDB用NoSQLプラグイン Transactd (bizstationcorpさん)

・ MySQLの内部処理の基本である「ISAM」と、それを独自に発展させた「Trandactd」の紹介
・ ISAM = "Indexed Sequential Access Method" (≠ MyISAMだけど、語源ではある)
    = インデックス順にアクセスする方式
・ レコードをフェッチする時のカーソルの挙動は7つだけ。これだけで全て完結する
 First(最初)、Last(最後)、Next(次)、Prev(前)、Equal(=)、Lessthan(=<)、Greater(=<)
・ ISAMが分かると、クエリの挙動が分かる = パフォーマンス、ロック範囲が分かる
・ Transactd は全てのSQLの実行を内部的(プラグイン)にISAM方式に変換して実行している
  → そのため超高速
・ 最新のチュートリアルはかなり力を入れたので、是非Transactdを一度試してもらいたい

ISAMの説明が非常に分かりやすく、知らなかった知識もしっかりと理解することが出来ました。
いわゆるMySQLのHandlerレイヤーの仕組みが分かったので、それをさらに掘り下げれば、
遅いクエリ、速いクエリの見分けがつくようになるかと思います。
公開されたパワポ資料には、口頭で話した内容も書かれているので、是非ご一読することを推奨します。

9. Test::mysqldの話 (songmuさん)

・ MySQLのテスト用ツールであるTest::mysqldの話
・ 元々kazuhoさんが開発したものを継承し、現在も開発は続けている(Go版作りました)
・ 各レイヤーごとにテストするよりは、アプリからDBまで一気通貫でテストしたい
・ 想定通りのデータが実際に参照されること、また更新が反映されることを確認
・ モックを頑張りすぎても意味はない

「Test::mysqld」ならテスト用サンプルデータを.sqlファイルにまとめて、
毎回自動的にインポートとかもできるみたいです。Dockerとの相性がよさそう。
実際にどんな挙動をするのか、後で時間を見つけてテストしたいと思います。

10. Advent Calendarの補足的な話 (i_rethiさん)

・ 以下の2016年MySQLアドベントカレンダーの投稿の補足
 http://d.hatena.ne.jp/hiroi10/20161222/1482333709
・ ib_logfile のサイズを大、小の2パターンでベンチマーク
・ 並列性もテスト
・ ベンチマーク結果の分析にはdimSTATを使用

詳しいテスト内容やスコアは記録してなかったので、資料の公開を待ちます。
dimSTAT、そろそろ使ってみないとなーと思いました。

11. かみぽ枠 (kamipoさん)

・ Rails のプルリク(バグ修正)をたくさんやる中で実際にあった失敗談
・ ZEROFILLの存在を意識せずにコードを直したら、unsigned判定でエラーが起こるようになった
・ ZEROFILLに対応できるように追加で修正をした
・ sql_modeまわりを改修したら、ANSI_QUOTESが有効になっている環境だと
  クオートが " に変換されてしまい、SHOW CREATE TABLEで情報を取っていた部分が
  正常に動かなくなった
・ information_schema(referential_constraints)から情報を取得するよう修正
・ ↑ の修正の後、外部キーの取得がすごく遅くなった(さらにMySQL5.0だと動かなくなった)
・ information_schema ではインデックスが特定の条件下じゃないと使われない
・ インデックスを使うよう修正、MySQL5.0のサポートは諦めた(依頼主には5.6に上げてもらった)

大多数の人にとっては「嬉しい」修正でも、一部の人(想定しづらい設定を使っている等)には
困った事態になることもあるみたいです。MySQLはオプションが豊富なので、もしかしたら
「まさかそんな設定を!?」という方は意外と多いのかもしれません。

先入観を持ってしまうのはいけないな、と思いました。

=========================

※ yoku0825 さんがまとめてくれた以下のTogetterも参考になります
  https://togetter.com/li/1077019

3
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?