• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
MySQL 入門的なはなし
 

MySQL 入門的なはなし

on

  • 2,636 views

 

Statistics

Views

Total Views
2,636
Views on SlideShare
1,808
Embed Views
828

Actions

Likes
4
Downloads
22
Comments
0

5 Embeds 828

http://blog.yuyat.jp 498
http://yuyat.jp 285
http://coderwall.com 31
http://webcache.googleusercontent.com 13
http://cache.yahoofs.jp 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    MySQL 入門的なはなし MySQL 入門的なはなし Presentation Transcript

    • 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 による探索が使われています (根本的な原理はだいたい一緒 (のはず (?)))
    • 二分探索木を 体験しよう (デモ)
    • 適切にインデックスを作ると•予めソートされたデータが作られる• 関係無いレコードを効率よく除外•検索が速くなる•レコードの挿入・更新時にコスト
    • HappyMySQL Life!
    • ご清聴 ありがとうございました