$30 off During Our Annual Pro Sale. View Details »

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)

    View Slide

  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

    View Slide

  3. What is table-size-estimator?
    • テーブル定義からディスクサイズを⾒積もるツール
    • CREATE TABLE⽂を⼊⼒し、そのテーブルの
    1レコードのサイズを出⼒
    • https://github.com/tom--bo/table-size-estimator
    • demo

    View Slide

  4. Why do I develop table-size-estimator?
    • MySQLのSQLパーサーが欲しい!
    • Query digestの作成とかクエリーの書き換えを
    ⾃分で柔軟にやりたい
    • Linterとか補完Pluginとか作りたい

    View Slide

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

    View Slide

  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(抽象構⽂⽊)を作ってるのかを知る⼿がかりにもなる

    View Slide

  7. Basic of Compiler
    • プログラムからToken,
    Syntaxを解析しつつ、
    構⽂⽊を作り、中間表現
    を作るまでがFrontend
    • そこから最適化をしつつ、
    機械コードを吐くのが
    Backend
    A.V. エイホ, M.S.ラム, R.セシィ, J.D.ウルマン 共著, 原⽥堅⼀ 訳, “コンパイラ[第2版] 原理・技法・ツール”,
    サイエンス社, 1990/10/10
    Backend
    Frontend

    View Slide

  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

    View Slide

  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/

    View Slide

  10. Compiler Frontend
    • 意味解析 (semantic analysis)
    • 構⽂解析時に作成した構⽂⽊と記号表の情報を使って意味
    的な解析を⾏う(型検査や型変換など)
    • 中間語作成
    • 構⽂⽊をそのまま中間表現とする場合もあるが、⽬的コード
    に近い形で実⾏順序に並べ中間表現とする場合もある
    • 今回は構⽂解析まで
    • create table⽂から情報を抜き出すだけなら構⽂解析までで
    ⼗分
    中⽥育男, “コンパイラの構成と最適化(第2版)”, 朝倉書店, 2014/11/20

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  14. Flex, 字句解析

    View Slide

  15. Bison, 構⽂解析

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

  19. disk-size from data-type (Date/Time)
    https://dev.mysql.com/doc/refman/8.0/en/storage-requirements.html

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

  24. Metadata for each record
    • Field Start Offsets
    • ⾏の各カラムが何バイト⽬で始まっ
    ているかを逆順で保持している
    • 1⾏のコンテンツ(全カラムの総
    フィールドサイズ)が127byte以下で
    あれば1カラムごとに1byte, それ以
    上であれば2byteが使われる
    https://dev.mysql.com/doc/internals/en/innodb-overview.html

    View Slide

  25. How to calculate disk-size from
    CREATE TABLE syntax
    • 実装済み
    • data-typeからわかるサイズ
    • Secondary indexとPK
    • ⾏ごとのメタデータサイズ
    • 未対応
    • PK, Secondary indexの中間ノード
    • ページごとのメタデータサイズ
    • innodb_fill_factor, merge_threshold

    View Slide

  26. Limitation of table-size-estimator
    • Partitionに対応していない
    • Pageごとのメタデータは考慮しない
    • フラグメンテーションは考慮しない(できない)
    • 1⽂字4byte固定(utfmb4想定でmaxsize)
    • 暗黙のPK(明⽰的にPK指定しないやつ)は対象外

    View Slide

  27. Future work
    • table-size-estimatorは引き続き機能を充実させます
    • Limitationの内容を潰していく
    • GitHub(https://github.com/tom--bo/table-size-estimator)
    にIssueお願いします

    View Slide

  28. Future work
    • それで?? SQL parserは?
    • Subset定義しつつ作るかもしれません。。。
    • SQLの構⽂は予想以上に複雑。
    • LALRのConflictがでないようにParser作るの⼤変、
    きれいに(メンテしやすい)Parser作るのむずい。
    • 意外な構⽂がぼろぼろ出てくる。
    • ドキュメントのsyntaxは完璧じゃない、補完が必須

    View Slide