MySQL 入門的なはなし

3,760 views

Published on

Published in: Technology, Business
1 Comment
4 Likes
Statistics
Notes
No Downloads
Views
Total views
3,760
On SlideShare
0
From Embeds
0
Number of Embeds
882
Actions
Shares
0
Downloads
30
Comments
1
Likes
4
Embeds 0
No embeds

No notes for slide

MySQL 入門的なはなし

  1. 1. M yS Q L入門的なはなし@yuya_takeyama
  2. 2. 今日の趣旨•主に MySQL 初心者を対象に•手っとり早くレバレッジの効く話を•します
  3. 3. アジェンダ•何故 MySQL 勉強会なのか• MySQL のアーキテクチャ•インデックスを使うと何故速い?•MySQL の勉強の仕方
  4. 4. アジェンダ•何故 MySQL 勉強会なのか• MySQL のアーキテクチャ•インデックスを使うと何故速い?•MySQL の勉強の仕方 間に合いませんでした...検索ワードに nippondanji を追加すれば情報の質が上がるのでオススメ
  5. 5. 何故MySQL 勉強会 なのか
  6. 6. コストパフォーマンス•遅い! というとき問題は大体 DB• プログラムの改善で 10 倍高速化は無理でも DB ならザラにある•うっかり作るとトンでもないことに
  7. 7. 知識の可搬性•他の RDBMS/DBMS にも適用可能•原理を知ればプログラミング一般にも適用可能
  8. 8. 今まさに MySQL が熱い•NOSQL ブームに騙されない• RDBMS を使いつつ, NOSQL で最 適化というパターンがほとんど•決済などのクリティカルなデータなら なおさら
  9. 9. MySQL のアーキテクチャ
  10. 10. http://www.oreilly.de/catalog/9780596101718/toc.html
  11. 11. •認証•接続の管理•ユーザとか
  12. 12. •SQL パーサ•クエリを解析
  13. 13. •クエリキャッシュ•使えるときはキャッシュを使う•使えない場合もある
  14. 14. •オプティマイザ(最適化器)•実行計画•どう検索すれば速いか?
  15. 15. •ストレージ エンジン•データを格納• プラッガブル (自由に選べる)•MySQL の 大きな特徴
  16. 16. クエリキャッシュ•同じクエリを実行したとき•結果が同じであることが保証されれば•キャッシュから使い回し
  17. 17. キャッシュされないクエリ•NOW()• CURDATE()•RAND()•その他比決定的な関数・値
  18. 18. オプティマイザ•実行計画の最適化を行う•どのインデックスを使うか•どういう順番でテーブルを開くか
  19. 19. オプティマイザに聞いてみよう•SELECT の前に• EXPLAIN とつけて•実行する•吟味する
  20. 20. 悪い例----+-------------+--------+------+---------------+------+---------+------+---------+-----------------------------+ 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 | +----+-------------+--------+-------+---------------+---------+---------+------+------+-------------+
  21. 21. 悪い例----+-------------+--------+------+---------------+------+---------+------+---------+-----------------------------+ 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 | +----+-------------+--------+-------+---------------+---------+---------+------+------+-------------+ 評価対象の行数
  22. 22. 悪い例----+-------------+--------+------+---------------+------+---------+------+---------+-----------------------------+ 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 | +----+-------------+--------+-------+---------------+---------+---------+------+------+-------------+ インデックスは使われているか
  23. 23. 悪い例----+-------------+--------+------+---------------+------+---------+------+---------+-----------------------------+ 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 | +----+-------------+--------+-------+---------------+---------+---------+------+------+-------------+ 実行時のソートは 発生していないか
  24. 24. どうする?
  25. 25. → インデックスをつくる
  26. 26. ストレージエンジン• データの入れ物• MySQL ではプラッガブル•InnoDB, MyISAM, Memory, Spider, Mroonga...• それぞれ得意・不得意などがある
  27. 27. どれを使うべきか•迷ったら InnoDB が無難• トランザクションが使える• ロックが行単位 (MyISAM はテーブルロック)•デフォルトでは MyISAM になって しまうので注意
  28. 28. アーキテクチャまとめ (1)•MySQL は様々なモジュールから成る•それぞれについて知ることで最適化のヒントを得ることができる
  29. 29. アーキテクチャまとめ (2)•クエリキャッシュの効くクエリを書こう•インデックスを適切に設定しよう•とりあえず EXPLAIN を見よう• 迷ったら InnoDB
  30. 30. インデックス を使うと 何故速い?
  31. 31. 参考動画 http://academicearth.org/lectures/run-times-and-algorithms-recursion 4:30 あたり※単純化のために二分探索 (Binary Search) を取り上げていますが, MySQL では B-Tree による探索が使われています (根本的な原理はだいたい一緒 (のはず (?)))
  32. 32. 二分探索木を 体験しよう (デモ)
  33. 33. 適切にインデックスを作ると•予めソートされたデータが作られる• 関係無いレコードを効率よく除外•検索が速くなる•レコードの挿入・更新時にコスト
  34. 34. HappyMySQL Life!
  35. 35. ご清聴 ありがとうございました

×