MySQLのアーキテクチャについて調べる – スレッド編

Published: 2016年5月22日 by tomsato

概要

MySQLの内部のアーキテクチャについて気になったのでまとめる
どういうスレッドがあるのかとスレッドのライフサイクルについて記述する

スレッド、プロセスとは

MySQLはシングルプロセスマルチスレッドモデルを採用しており
1つのmysqldプロセスの内部に、複数のスレッドが存在している

そもそもプロセスとはプログラム(実行バイナリ)がOS上に実体を持ち、実行できる状態になったもので、プログラムがメモリにロードされて実行できる状態になったものをいう

スレッドはプロセスの中での実行単位

db01

簡単な例を出すとアプリケーションは劇場、プロセスは舞台、スレッドは役者という風に考えられる

ちなみに蛇足メモ
→ MySQLが使用する最大メモリ = グローバルバッファ + max_connections × スレッドバッファの合計値

MySQLのスレッドについて

大きく分けてフォアグラウンドスレッド、バックグラウンドスレッドの2種類のスレッドが存在している
それぞれの中にも多数のスレッドがあってスレッドによって役割が異なる
多数のスレッドがそれぞれの役割を果たすことによってMySQLというアプリケーションができあがる

フォアグラウンドスレッド

1コネクションあたり1つのフォアグラウンドスレッドを起動しておりMySQLのほとんどのスレッドはフォアグラウンドスレッドで占有している

レプリケーション関連のスレッドもフォアグラウンドスレッドである

バックグラウンドスレッド

バックグラウンドスレッドの多くはInnoDBの非同期スレッド
https://dev.mysql.com/doc/refman/5.6/ja/innodb-performance-multiple_io_threads.html

■ コネクションをハンドルする時のライフサイクル

チューニングをする際に、どういう流れでデータを取得しているのかの流れを理解しておくとわかりやすい

db02

mysqldプロセスがclientから接続要求を受けると子プロセスをcloneしてそれがフォアグラウンドスレッドになる
認証や構文解析などを行った後、ストレージエンジンからデータを取得してデータを返却している

MySQLのチューニングを考えた時に一番処理に時間がかかっているのはエグゼキューターである
しかしそもそもオプティマイザが実行計画を作成していてその実行計画通りにエグゼキューターはストレージから取得しているだけである

実行計画が悪いとエグゼキューターの処理が遅くなる
つまりチューニングを考える際は実行計画を確認することが大事になる

実行計画を取得する方法は今回は割愛するが「EXPLAIN SELECT ~」を使って
・インデックスを使わないでテーブルを1行1行と全件検索していないか
・サブクエリの中にサブクエリを使っていてネストが深くなっていないか
などを確認する

※ 参考サイトから自分なりに噛み砕いてみましたが間違っていたらごめんなさい

参考

コメントを書く

※ Emailは公開されません

※ コメントは承認されると下記に表示されます

コメント一覧

最近の投稿

社内ツールなどの超小規模なAPIをGolangで実装する際にフレームワークを使うべきかを、実際にnet/httpを使った実装とフレームワークを使った実装を比較することでどれだけ優位性があるかを見ていきたいと思います。今回はフレームワークにはシンプルで使いやすそうなEchoを使うことにします。

vue-pdfを使ってNuxt.jsで作成しているアプリケーションに pdfスライドを表示させるサンプルを作成しました README.md通りに実装してもうまくいかないところがあったのでそのあたり含めてまとめます

Vue.js / Nuxt.jsにおけるログインの実装方法をまとめる Auth0やNuxt.jsのAuth Moduleとmiddlewareについて調べつつサンプルを作成することで理解を深める

コンポーネント設計について考える Atomic DesignやPresentational Component, Container Componentについてまとめつつ 自分だったらVue.js / Nuxt.jsでどういうコンポーネント設計にするかについてまとめます

Netlify Formsを使ってブログサイトにコメント機能を追加する方法を調べたので紹介 Netlify FormsはNetlifyに標準機能として用意されているフォーム機能 サーバレスなので別途コメント用にサーバを用意する必要がなくHTMLを埋め込むだけで準備できる

カテゴリ一覧

タグ一覧