mysql 入門的なはなし

Post on 13-Jan-2015

2.594 Views

Category:

Technology

1 Downloads

Preview:

Click to see full reader

DESCRIPTION

 

TRANSCRIPT

MySQL入門的なはなし@yuya_takeyama

今日の趣旨

•主に MySQL 初心者を対象に

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

アジェンダ

•何故 MySQL 勉強会なのか

•MySQL のアーキテクチャ

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

アジェンダ

•何故 MySQL 勉強会なのか

•MySQL のアーキテクチャ

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

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

何故MySQL 勉強会

なのか

コストパフォーマンス

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

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

知識の可搬性

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

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

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

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

MySQLの

アーキテクチャ

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

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

•クエリキャッシュ

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

•使えない場合もある

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

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

•ストレージエンジン

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

•MySQL の大きな特徴

クエリキャッシュ

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

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

•NOW()

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

オプティマイザ

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

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

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

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

参考動画

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

4:30 あたり

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

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

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

HappyMySQLLife!

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

top related