SlideShare a Scribd company logo
M yS Q L
入門的なはなし
@yuya_takeyama
今日の趣旨

•主に MySQL 初心者を対象に

•手っとり早くレバレッジの効く話を
•します
アジェンダ

•何故 MySQL 勉強会なのか

• MySQL のアーキテクチャ

•インデックスを使うと何故速い?
•MySQL の勉強の仕方
アジェンダ

•何故 MySQL 勉強会なのか

• MySQL のアーキテクチャ

•インデックスを使うと何故速い?
•MySQL の勉強の仕方
              間に合いませんでした...
検索ワードに nippondanji を追加すれば情報の質が上がるのでオススメ
何故
MySQL 勉強会
   なのか
コストパフォーマンス

•遅い! というとき問題は大体 DB

• プログラムの改善で 10 倍高速化は
無理でも DB ならザラにある

•うっかり作るとトンでもないことに
知識の可搬性

•
他の RDBMS/DBMS にも適用可能

•原理を知ればプログラミング一般にも
適用可能
今まさに MySQL が熱い
•NOSQL ブームに騙されない

• RDBMS を使いつつ, NOSQL で最
 適化というパターンがほとんど

•決済などのクリティカルなデータなら
 なおさら
MySQL
   の
アーキテクチャ
http://www.oreilly.de/catalog/9780596101718/toc.html
•
認証

•接続の管理
•ユーザとか
•SQL パーサ
•クエリを解析
•クエリ
キャッシュ

•
使えるときは
キャッシュを
使う

•
使えない場合
もある
•
オプティマイザ
(最適化器)

•実行計画
•どう検索すれば
速いか?
•ストレージ
 エンジン

•データを格納

• プラッガブル
 (自由に選べる)

•MySQL の
 大きな特徴
クエリキャッシュ

•
同じクエリを実行したとき

•結果が同じであることが保証されれば
•キャッシュから使い回し
キャッシュされないクエリ

•
NOW()

• CURDATE()

•RAND()
•その他比決定的な関数・値
オプティマイザ

•実行計画の最適化を行う

•どのインデックスを使うか
•どういう順番でテーブルを開くか
オプティマイザに聞いてみよう

•SELECT の前に

• EXPLAIN とつけて

•実行する
•吟味する
悪い例
----+-------------+--------+------+---------------+------+---------+------+---------+-----------------------------+
 id | select_type | table | type | possible_keys | key | key_len | ref | rows       | Extra                       |
----+-------------+--------+------+---------------+------+---------+------+---------+-----------------------------+
  1 | SIMPLE      | person | ALL | NULL           | NULL | NULL    | NULL | 1679821 | Using where; Using filesort |
----+-------------+--------+------+---------------+------+---------+------+---------+-----------------------------+




                                             良い例
      +----+-------------+--------+-------+---------------+---------+---------+-------+------+-------+
      | id | select_type | table | type | possible_keys | key       | key_len | ref   | rows | Extra |
      +----+-------------+--------+-------+---------------+---------+---------+-------+------+-------+
      | 1 | SIMPLE       | person | const | PRIMARY       | PRIMARY | 34      | const |    1 |       |
      +----+-------------+--------+-------+---------------+---------+---------+-------+------+-------+

      +----+-------------+--------+-------+---------------+---------+---------+------+------+-------------+
      | id | select_type | table | type | possible_keys | key       | key_len | ref | rows | Extra        |
      +----+-------------+--------+-------+---------------+---------+---------+------+------+-------------+
      | 1 | SIMPLE       | person | range | PRIMARY       | PRIMARY | 34      | NULL | 1484 | Using where |
      +----+-------------+--------+-------+---------------+---------+---------+------+------+-------------+
悪い例
----+-------------+--------+------+---------------+------+---------+------+---------+-----------------------------+
 id | select_type | table | type | possible_keys | key | key_len | ref | rows       | Extra                       |
----+-------------+--------+------+---------------+------+---------+------+---------+-----------------------------+
  1 | SIMPLE      | person | ALL | NULL           | NULL | NULL    | NULL | 1679821 | Using where; Using filesort |
----+-------------+--------+------+---------------+------+---------+------+---------+-----------------------------+




                                             良い例
      +----+-------------+--------+-------+---------------+---------+---------+-------+------+-------+
      | id | select_type | table | type | possible_keys | key       | key_len | ref   | rows | Extra |
      +----+-------------+--------+-------+---------------+---------+---------+-------+------+-------+
      | 1 | SIMPLE       | person | const | PRIMARY       | PRIMARY | 34      | const |    1 |       |
      +----+-------------+--------+-------+---------------+---------+---------+-------+------+-------+

      +----+-------------+--------+-------+---------------+---------+---------+------+------+-------------+
      | id | select_type | table | type | possible_keys | key       | key_len | ref | rows | Extra        |
      +----+-------------+--------+-------+---------------+---------+---------+------+------+-------------+
      | 1 | SIMPLE       | person | range | PRIMARY       | PRIMARY | 34      | NULL | 1484 | Using where |
      +----+-------------+--------+-------+---------------+---------+---------+------+------+-------------+




                                評価対象の行数
悪い例
----+-------------+--------+------+---------------+------+---------+------+---------+-----------------------------+
 id | select_type | table | type | possible_keys | key | key_len | ref | rows       | Extra                       |
----+-------------+--------+------+---------------+------+---------+------+---------+-----------------------------+
  1 | SIMPLE      | person | ALL | NULL           | NULL | NULL    | NULL | 1679821 | Using where; Using filesort |
----+-------------+--------+------+---------------+------+---------+------+---------+-----------------------------+




                                             良い例
      +----+-------------+--------+-------+---------------+---------+---------+-------+------+-------+
      | id | select_type | table | type | possible_keys | key       | key_len | ref   | rows | Extra |
      +----+-------------+--------+-------+---------------+---------+---------+-------+------+-------+
      | 1 | SIMPLE       | person | const | PRIMARY       | PRIMARY | 34      | const |    1 |       |
      +----+-------------+--------+-------+---------------+---------+---------+-------+------+-------+

      +----+-------------+--------+-------+---------------+---------+---------+------+------+-------------+
      | id | select_type | table | type | possible_keys | key       | key_len | ref | rows | Extra        |
      +----+-------------+--------+-------+---------------+---------+---------+------+------+-------------+
      | 1 | SIMPLE       | person | range | PRIMARY       | PRIMARY | 34      | NULL | 1484 | Using where |
      +----+-------------+--------+-------+---------------+---------+---------+------+------+-------------+




       インデックスは使われているか
悪い例
----+-------------+--------+------+---------------+------+---------+------+---------+-----------------------------+
 id | select_type | table | type | possible_keys | key | key_len | ref | rows       | Extra                       |
----+-------------+--------+------+---------------+------+---------+------+---------+-----------------------------+
  1 | SIMPLE      | person | ALL | NULL           | NULL | NULL    | NULL | 1679821 | Using where; Using filesort |
----+-------------+--------+------+---------------+------+---------+------+---------+-----------------------------+




                                             良い例
      +----+-------------+--------+-------+---------------+---------+---------+-------+------+-------+
      | id | select_type | table | type | possible_keys | key       | key_len | ref   | rows | Extra |
      +----+-------------+--------+-------+---------------+---------+---------+-------+------+-------+
      | 1 | SIMPLE       | person | const | PRIMARY       | PRIMARY | 34      | const |    1 |       |
      +----+-------------+--------+-------+---------------+---------+---------+-------+------+-------+

      +----+-------------+--------+-------+---------------+---------+---------+------+------+-------------+
      | id | select_type | table | type | possible_keys | key       | key_len | ref | rows | Extra        |
      +----+-------------+--------+-------+---------------+---------+---------+------+------+-------------+
      | 1 | SIMPLE       | person | range | PRIMARY       | PRIMARY | 34      | NULL | 1484 | Using where |
      +----+-------------+--------+-------+---------------+---------+---------+------+------+-------------+




                            実行時のソートは
                            発生していないか
どうする?
→ インデックスをつくる
ストレージエンジン
•   データの入れ物

• MySQL ではプラッガブル

•InnoDB, MyISAM, Memory,
 Spider, Mroonga...

•   それぞれ得意・不得意などがある
どれを使うべきか
•迷ったら InnoDB が無難
• トランザクションが使える

• ロックが行単位
 (MyISAM はテーブルロック)

•デフォルトでは MyISAM になって
 しまうので注意
アーキテクチャまとめ (1)


•
MySQL は様々なモジュールから成
る

•それぞれについて知ることで最適化の
ヒントを得ることができる
アーキテクチャまとめ (2)

•
クエリキャッシュの効く
クエリを書こう

•インデックスを適切に設定しよう
•とりあえず EXPLAIN を見よう
• 迷ったら InnoDB
インデックス
 を使うと
 何故速い?
参考動画

   http://academicearth.org/lectures/run-times-and-algorithms-recursion

                       4:30 あたり
※単純化のために二分探索 (Binary Search) を
取り上げていますが, MySQL では B-Tree によ
る探索が使われています (根本的な原理はだいたい
一緒 (のはず (?)))
二分探索木を
 体験しよう
  (デモ)
適切にインデックスを作ると

•予めソートされたデータが作られる

• 関係無いレコードを効率よく除外

•検索が速くなる
•レコードの挿入・更新時にコスト
Happy
MySQL
 Life!
ご清聴
 ありがとう
ございました

More Related Content

KEY
メッチャ役に立つauto_incrementの話
PDF
PHP と MySQL でカジュアルに MapReduce する (Short Version)
PDF
データベースをAI開発に活用
PDF
PHP と MySQL で 1 カチャカチャカチャ...ッターン! MapReduce (@ニコニコ超会議)
PPTX
大規模CSVをMySQLに入れる
PDF
MySQL勉強会 インデックス編.2013 08-02
PPT
20090107 Postgre Sqlチューニング(Sql編)
PPT
SQLチューニング勉強会資料
メッチャ役に立つauto_incrementの話
PHP と MySQL でカジュアルに MapReduce する (Short Version)
データベースをAI開発に活用
PHP と MySQL で 1 カチャカチャカチャ...ッターン! MapReduce (@ニコニコ超会議)
大規模CSVをMySQLに入れる
MySQL勉強会 インデックス編.2013 08-02
20090107 Postgre Sqlチューニング(Sql編)
SQLチューニング勉強会資料

Similar to MySQL 入門的なはなし (20)

PDF
MySQL Index勉強会外部公開用
PDF
ISUCONで学ぶ Webアプリケーションのパフォーマンス向上のコツ 実践編 完全版
PDF
JPUGしくみ+アプリケーション勉強会(第20回)
PDF
pg_trgmと全文検索
PPT
今年こそ始めたい!SQL超入門 MIRACLE Linux Meetup版 0620
PPT
今年こそ始めたい!SQL超入門 セミナー資料 2024年5月22日 富士通クラウドミートアップ
PDF
ヤフー社内でやってるMySQLチューニングセミナー大公開
PDF
2018年度 若手技術者向け講座 大量データの扱い・ストアド・メモリ管理
PDF
2018年度 若手技術者向け講座 インデックス
PPTX
Db seminar 20190619
PDF
RailsエンジニアのためのSQLチューニング速習会
PPT
Online schema change in mysql casual #1(2010/12/11)
PPT
Online schema change in mysql casual #1(2010/12/11)
PDF
Mroongaを使ったときの MySQLの制限との戦い
PPTX
Postgre SQL 9.3 新機能
PDF
[db tech showcase Tokyo 2015] A14:Amazon Redshiftの元となったスケールアウト型カラムナーDB徹底解説 その...
PDF
SQL Server チューニング基礎
PDF
Sql基礎の基礎
PPTX
Ruby on Rails on MySQL チューニング入門
PDF
PostgreSQL18新機能紹介(db tech showcase 2025 発表資料)
MySQL Index勉強会外部公開用
ISUCONで学ぶ Webアプリケーションのパフォーマンス向上のコツ 実践編 完全版
JPUGしくみ+アプリケーション勉強会(第20回)
pg_trgmと全文検索
今年こそ始めたい!SQL超入門 MIRACLE Linux Meetup版 0620
今年こそ始めたい!SQL超入門 セミナー資料 2024年5月22日 富士通クラウドミートアップ
ヤフー社内でやってるMySQLチューニングセミナー大公開
2018年度 若手技術者向け講座 大量データの扱い・ストアド・メモリ管理
2018年度 若手技術者向け講座 インデックス
Db seminar 20190619
RailsエンジニアのためのSQLチューニング速習会
Online schema change in mysql casual #1(2010/12/11)
Online schema change in mysql casual #1(2010/12/11)
Mroongaを使ったときの MySQLの制限との戦い
Postgre SQL 9.3 新機能
[db tech showcase Tokyo 2015] A14:Amazon Redshiftの元となったスケールアウト型カラムナーDB徹底解説 その...
SQL Server チューニング基礎
Sql基礎の基礎
Ruby on Rails on MySQL チューニング入門
PostgreSQL18新機能紹介(db tech showcase 2025 発表資料)
Ad

More from Yuya Takeyama (14)

PDF
5分でわかる? 関数型 PHP の潮流
PDF
Good Parts of PHP and the UNIX Philosophy
PDF
Reactor Pattern and React
PDF
PHP と MySQL でカジュアルに MapReduce する
PDF
PHPUnit でテスト駆動開発を始めよう
PDF
HashTable と HashDos
PDF
Proposal for xSpep BDD Framework for PHP
PDF
Building Development Environment with php-build and phpenv
PDF
PHPUnit でよりよくテストを書くために
PDF
Making DSL with []
PDF
LIMIT 付きで UPDATE を行うと何故怒られるか
PDF
GOOS #1
PDF
Ruby 同好会宣言
ODP
第一回 社内勉強会 PHP Application Security Checklist に学ぶ PHP セキュリティ (Excerpt)
5分でわかる? 関数型 PHP の潮流
Good Parts of PHP and the UNIX Philosophy
Reactor Pattern and React
PHP と MySQL でカジュアルに MapReduce する
PHPUnit でテスト駆動開発を始めよう
HashTable と HashDos
Proposal for xSpep BDD Framework for PHP
Building Development Environment with php-build and phpenv
PHPUnit でよりよくテストを書くために
Making DSL with []
LIMIT 付きで UPDATE を行うと何故怒られるか
GOOS #1
Ruby 同好会宣言
第一回 社内勉強会 PHP Application Security Checklist に学ぶ PHP セキュリティ (Excerpt)
Ad

MySQL 入門的なはなし