Upgrade to Pro — share decks privately, control downloads, hide ads and more …

About table-size-estimator

About table-size-estimator

SHOW CREATE TABLE hoge; から取得したCREATE TABLE文からテーブルのディスクサイズを見積もるためのツールを作りました
MySQL Casual Talks vol.11, 2019/6/7

tom--bo

June 07, 2019
Tweet

More Decks by tom--bo

Other Decks in Programming

Transcript

  1. MySQL table-size-estimator @tom__bo (MySQL Casual 6/7)

  2. Outline • What is table-size-estimator • Why do I develop

    table-size-estimator? • CREATE TABLE Syntax • Subset of CREATE TABLE Syntax • How to calculate disk-size from CREATE TABLE • Limitations • Future work
  3. What is table-size-estimator? • テーブル定義からディスクサイズを⾒積もるツール • CREATE TABLE⽂を⼊⼒し、そのテーブルの 1レコードのサイズを出⼒ •

    https://github.com/tom--bo/table-size-estimator • demo
  4. Why do I develop table-size-estimator? • MySQLのSQLパーサーが欲しい! • Query digestの作成とかクエリーの書き換えを

    ⾃分で柔軟にやりたい • Linterとか補完Pluginとか作りたい
  5. Can I use existings? • MySQL本体のparser?? • includeしているものが多くてparser部分だけ抜き出すのむずい • そもそもparser周辺の仕組みを知らないので、切り出す部分の判

    断がむずい • TiDBのparserが読みやすそう?? • MySQL-client互換 • Goで書かれてる(C++よりは切り出しが簡単) • パーサが別packageに出されている • github.com/pingcap/parser/mysql • だめだ結局何をしてるのかよくわからん
  6. Can I use existings? • MySQL本体のparser?? • headerが多くてparser部分だけ抜き出すのむずい • そもそもparser周辺の仕組みを知らないので、切り出す部分の判

    断がむずい • TiDBのparserが読みやすそう?? • MySQL-client互換 • golangで書かれてる(C++よりは切り出しが簡単) • パーサが別packageに出されている • github.com/pingcap/parser/mysql • だめだ結局何をしてるのかよくわからん 作ってみよう! Parseの仕組みを知ることで、MySQLがどうやってParseして どんなAST(抽象構⽂⽊)を作ってるのかを知る⼿がかりにもなる
  7. Basic of Compiler • プログラムからToken, Syntaxを解析しつつ、 構⽂⽊を作り、中間表現 を作るまでがFrontend • そこから最適化をしつつ、

    機械コードを吐くのが Backend A.V. エイホ, M.S.ラム, R.セシィ, J.D.ウルマン 共著, 原⽥堅⼀ 訳, “コンパイラ[第2版] 原理・技法・ツール”, サイエンス社, 1990/10/10 Backend Frontend
  8. Compiler Frontend • 字句解析 (lexical analysis) • プログラム中の語彙(lexicon), 単語(word)を トークン(token)として抽出する

    • ex) “CREATE”, “TABLE”, “INT”, “BIGINT”, ”=“, “,”, “;” ... • 今回は既存のlexical analyzerであるflexを使う • https://www.gnu.org/software/flex/ • https://github.com/westes/flex ⼭下義⾏, “コンパイラ⼊⾨ -構⽂解析の原理とlex/yacc, C⾔語による実装-”, サイエンス社, 2008/6/25
  9. Compiler Frontend • 構⽂解析 (syntax analysis) • 字句解析で抽出されたトークンからプログラムの構⽂構造 (Syntax Structure)を解析する

    • 解析したトークン列は具象構⽂⽊や抽象構⽂⽊で表現する • 今回はパーサジェネレータのYacc(Yet Another Compiler Compiler)の上位互換であるBisonを使う • LALR(1) 構⽂解析器 (Look Ahead Left to Right) • https://www.gnu.org/software/bison/
  10. Compiler Frontend • 意味解析 (semantic analysis) • 構⽂解析時に作成した構⽂⽊と記号表の情報を使って意味 的な解析を⾏う(型検査や型変換など) •

    中間語作成 • 構⽂⽊をそのまま中間表現とする場合もあるが、⽬的コード に近い形で実⾏順序に並べ中間表現とする場合もある • 今回は構⽂解析まで • create table⽂から情報を抜き出すだけなら構⽂解析までで ⼗分 中⽥育男, “コンパイラの構成と最適化(第2版)”, 朝倉書店, 2014/11/20
  11. CREATE TABLE syntax • Sample syntax from document https://dev.mysql.com/doc/refman/5.7/en/create-table.html

  12. CREATE TABLE syntax • Full syntax from document https://dev.mysql.com/doc/refman/5.7/en/create-table.html

  13. Subset of CREATE TABLE syntax • subset https://github.com/tom--bo/table-size-estimator#supported-syntax

  14. Flex, 字句解析

  15. Bison, 構⽂解析

  16. How to calculate disk-size from CREATE TABLE syntax • data-typeからわかるサイズ

    • Secondary indexとPK • ⾏ごとのメタデータサイズ
  17. How to calculate disk-size from CREATE TABLE syntax • data-typeからわかるサイズ

    • Secondary indexとPK • ⾏ごとのメタデータサイズ
  18. disk-size from data-type (Number) • DECIMAL(M,D), NUMERIC(M,D) • Mは最⼤桁数, Dは⼩数点の右側の桁数

    (scale) • M <= 65, D <= M, D <= 30 • MとDはそれぞれ別々に計算され、9桁ご とに4byte, あまりは以下のテーブルのよ うにbyte数が必要 https://dev.mysql.com/doc/refman/8.0/en/storage-requirements.html
  19. disk-size from data-type (Date/Time) https://dev.mysql.com/doc/refman/8.0/en/storage-requirements.html

  20. disk-size from data-type (String) Lは⽂字列のバイト⻑. utf8は最⼤3byte, utf8mb4は最⼤4byte https://dev.mysql.com/doc/refman/8.0/en/storage-requirements.html

  21. How to calculate disk-size from CREATE TABLE syntax • data-typeからわかるサイズ

    • Secondary indexとPK • ⾏ごとのメタデータサイズ
  22. PK and secondary index • Secondary IndexはLeaf nodeにPKの値を保持している https://dev.mysql.com/doc/refman/8.0/en/innodb-index-types.html http://nippondanji.blogspot.com/2010/10/innodb.html

  23. How to calculate disk-size from CREATE TABLE syntax • data-typeからわかるサイズ

    • PKとSecondary indexとPK • ⾏ごとのメタデータサイズ
  24. Metadata for each record • Field Start Offsets • ⾏の各カラムが何バイト⽬で始まっ

    ているかを逆順で保持している • 1⾏のコンテンツ(全カラムの総 フィールドサイズ)が127byte以下で あれば1カラムごとに1byte, それ以 上であれば2byteが使われる https://dev.mysql.com/doc/internals/en/innodb-overview.html
  25. How to calculate disk-size from CREATE TABLE syntax • 実装済み

    • data-typeからわかるサイズ • Secondary indexとPK • ⾏ごとのメタデータサイズ • 未対応 • PK, Secondary indexの中間ノード • ページごとのメタデータサイズ • innodb_fill_factor, merge_threshold
  26. Limitation of table-size-estimator • Partitionに対応していない • Pageごとのメタデータは考慮しない • フラグメンテーションは考慮しない(できない) •

    1⽂字4byte固定(utfmb4想定でmaxsize) • 暗黙のPK(明⽰的にPK指定しないやつ)は対象外
  27. Future work • table-size-estimatorは引き続き機能を充実させます • Limitationの内容を潰していく • GitHub(https://github.com/tom--bo/table-size-estimator) にIssueお願いします

  28. Future work • それで?? SQL parserは? • Subset定義しつつ作るかもしれません。。。 • SQLの構⽂は予想以上に複雑。

    • LALRのConflictがでないようにParser作るの⼤変、 きれいに(メンテしやすい)Parser作るのむずい。 • 意外な構⽂がぼろぼろ出てくる。 • ドキュメントのsyntaxは完璧じゃない、補完が必須