mysql 入門的なはなし

35
My SQL 入門的なはなし @yuya_takeyama

Upload: yuya-takeyama

Post on 13-Jan-2015

2.594 views

Category:

Technology


1 download

DESCRIPTION

 

TRANSCRIPT

Page 1: MySQL 入門的なはなし

MySQL入門的なはなし@yuya_takeyama

Page 2: MySQL 入門的なはなし

今日の趣旨

•主に MySQL 初心者を対象に

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

Page 3: MySQL 入門的なはなし

アジェンダ

•何故 MySQL 勉強会なのか

•MySQL のアーキテクチャ

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

Page 4: MySQL 入門的なはなし

アジェンダ

•何故 MySQL 勉強会なのか

•MySQL のアーキテクチャ

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

間に合いませんでした...検索ワードに nippondanji を追加すれば情報の質が上がるのでオススメ

Page 5: MySQL 入門的なはなし

何故MySQL 勉強会

なのか

Page 6: MySQL 入門的なはなし

コストパフォーマンス

•遅い! というとき問題は大体 DB•プログラムの改善で 10 倍高速化は無理でも DB ならザラにある

•うっかり作るとトンでもないことに

Page 7: MySQL 入門的なはなし

知識の可搬性

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

•原理を知ればプログラミング一般にも適用可能

Page 8: MySQL 入門的なはなし

今まさに MySQL が熱い•NOSQL ブームに騙されない•RDBMS を使いつつ, NOSQL で最適化というパターンがほとんど

•決済などのクリティカルなデータならなおさら

Page 9: MySQL 入門的なはなし

MySQLの

アーキテクチャ

Page 11: MySQL 入門的なはなし

•認証•接続の管理•ユーザとか

Page 12: MySQL 入門的なはなし

•SQL パーサ•クエリを解析

Page 13: MySQL 入門的なはなし

•クエリキャッシュ

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

•使えない場合もある

Page 14: MySQL 入門的なはなし

•オプティマイザ(最適化器)

•実行計画•どう検索すれば速いか?

Page 15: MySQL 入門的なはなし

•ストレージエンジン

•データを格納•プラッガブル(自由に選べる)

•MySQL の大きな特徴

Page 16: MySQL 入門的なはなし

クエリキャッシュ

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

Page 17: MySQL 入門的なはなし

キャッシュされないクエリ

•NOW()

•CURDATE()•RAND()•その他比決定的な関数・値

Page 18: MySQL 入門的なはなし

オプティマイザ

•実行計画の最適化を行う•どのインデックスを使うか•どういう順番でテーブルを開くか

Page 19: MySQL 入門的なはなし

オプティマイザに聞いてみよう

•SELECT の前に•EXPLAIN とつけて•実行する•吟味する

Page 20: MySQL 入門的なはなし

+----+-------------+--------+-------+---------------+---------+---------+-------+------+-------+| 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 |+----+-------------+--------+------+---------------+------+---------+------+---------+-----------------------------+

悪い例

良い例

Page 21: MySQL 入門的なはなし

+----+-------------+--------+-------+---------------+---------+---------+-------+------+-------+| 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 |+----+-------------+--------+------+---------------+------+---------+------+---------+-----------------------------+

悪い例

良い例

評価対象の行数

Page 22: MySQL 入門的なはなし

+----+-------------+--------+------+---------------+------+---------+------+---------+-----------------------------+| 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 |+----+-------------+--------+-------+---------------+---------+---------+------+------+-------------+

インデックスは使われているか

Page 23: MySQL 入門的なはなし

+----+-------------+--------+------+---------------+------+---------+------+---------+-----------------------------+| 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 |+----+-------------+--------+-------+---------------+---------+---------+------+------+-------------+

実行時のソートは発生していないか

Page 24: MySQL 入門的なはなし

どうする?

Page 25: MySQL 入門的なはなし

→ インデックスをつくる

Page 26: MySQL 入門的なはなし

ストレージエンジン•データの入れ物•MySQL ではプラッガブル

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

•それぞれ得意・不得意などがある

Page 27: MySQL 入門的なはなし

どれを使うべきか•迷ったら InnoDB が無難•トランザクションが使える•ロックが行単位(MyISAM はテーブルロック)

•デフォルトでは MyISAM になってしまうので注意

Page 28: MySQL 入門的なはなし

アーキテクチャまとめ (1)

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

•それぞれについて知ることで最適化のヒントを得ることができる

Page 29: MySQL 入門的なはなし

アーキテクチャまとめ (2)

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

•インデックスを適切に設定しよう•とりあえず EXPLAIN を見よう•迷ったら InnoDB

Page 30: MySQL 入門的なはなし

インデックスを使うと何故速い?

Page 31: MySQL 入門的なはなし

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

参考動画

※単純化のために二分探索 (Binary Search) を取り上げていますが, MySQL では B-Tree による探索が使われています (根本的な原理はだいたい一緒 (のはず (?)))

4:30 あたり

Page 32: MySQL 入門的なはなし

二分探索木を体験しよう(デモ)

Page 33: MySQL 入門的なはなし

適切にインデックスを作ると

•予めソートされたデータが作られる•関係無いレコードを効率よく除外•検索が速くなる•レコードの挿入・更新時にコスト

Page 34: MySQL 入門的なはなし

HappyMySQLLife!

Page 35: MySQL 入門的なはなし

ご清聴ありがとうございました