Upload
yuji-otani
View
3.851
Download
1
Embed Size (px)
DESCRIPTION
社内で行ったMySQL勉強会の資料です。 コンテンツは下記になります。 ・MySQLの概要 ・バージョンと新機能 ・インデックスについて ・知っておきたいSQL
Citation preview
Copyright © 2013 TriFort, Inc. All Rights Reserved.
MySQL 勉強会〜基礎編〜
技術統轄本部大谷 祐司
Copyright © 2013 TriFort, Inc. All Rights Reserved.
MySQL 勉強会
TriFort で標準 DB として採用されている
MySQL 。
基本的な内容から応用的な内容まで、幅広く
お届けしたいと思います。
Copyright © 2013 TriFort, Inc. All Rights Reserved.
アジェンダ
・ MySQL の概要
・バージョンと新機能
・インデックスについて
・知っておきたい SQL
Copyright © 2013 TriFort, Inc. All Rights Reserved.
MySQL の概要
Copyright © 2013 TriFort, Inc. All Rights Reserved.
世界で一番使われているオープンソース・データベース
Copyright © 2013 TriFort, Inc. All Rights Reserved.
MySQL の運営組織
1995 年: MySQL AB によってリリース
2008 年:サン・マイクロシステムズが MySQL AB 買収
2009 年:オラクルがサン・マイクロシステムズ買収
現在は、オラクルが MySQL を開発している。
Copyright © 2013 TriFort, Inc. All Rights Reserved.
MySQL の fork 「 MariaDB 」の台頭
Fedora19 がリリース。
デフォルトの DB が MySQL から MariaDB に変更されました。
2013 年 7 月
Copyright © 2013 TriFort, Inc. All Rights Reserved.
Google も MariaDB 採用へ
社内データベースに MariaDB 10.0 を採用している。
Google が MariaDB Foundation に開発者を派遣。
Copyright © 2013 TriFort, Inc. All Rights Reserved.
MySQL の歴史
Copyright © 2013 TriFort, Inc. All Rights Reserved.
1995 年 5 月
最初のバージョンがリリース。
Copyright © 2013 TriFort, Inc. All Rights Reserved.
2003 年 3 月
バージョン 4.0 プロダクション版
リリース
Copyright © 2013 TriFort, Inc. All Rights Reserved.
・クエリキャッシュ
・バルクインサート
・ InnoDB ストレージエンジン
・ SQL : TRUNCATE 文
・ SQL : UNION 文
・ SET 文が使えるようになった
・複数テーブルの DELETE/UPDATE
・ FOUND_ROWS
Copyright © 2013 TriFort, Inc. All Rights Reserved.
2004 年 10 月
バージョン 4.1 プロダクション版
リリース
Copyright © 2013 TriFort, Inc. All Rights Reserved.
・サブクエリのサポート
・ SQL : CREATE TABLE XXX LIKE XXX
・ SSL 接続を介したレプリケーション
・ SQL : ON DUPLICATE KEY UPDATE
・ 1 度に複数クエリの実行
・ GROUP_CONCAT() 関数
Copyright © 2013 TriFort, Inc. All Rights Reserved.
2005 年 10 月バージョン 5 プロダクション版
リリース
Copyright © 2013 TriFort, Inc. All Rights Reserved.
・ストアドプロシージャ
・ VARCHAR の 255 文字以上対応
Copyright © 2013 TriFort, Inc. All Rights Reserved.
2008 年 11 月バージョン 5.1 プロダクション版
リリース
Copyright © 2013 TriFort, Inc. All Rights Reserved.
・テーブルのパーティショニング
・行ベースのレプリケーション
・プラグイン API
・イベント スケジューラ
・サーバログテーブル
・テーブルスペースのバックアップ
(mysqldump)
・ INFORMATION_SCHEMA に対する改良
Copyright © 2013 TriFort, Inc. All Rights Reserved.
2010 年 12 月バージョン 5.5 プロダクション版
リリース
Copyright © 2013 TriFort, Inc. All Rights Reserved.
・標準ストレージエンジンが InnoDB に変
更。
・ InnoDB の大幅な改善
・準同期レプリケーション
・レプリケーションの改善
・ 4 バイト UTF-8 対応
・ RANGE/LIS パーテショニング
Copyright © 2013 TriFort, Inc. All Rights Reserved.
2013 年 2 月バージョン 5.6 プロダクション版
リリース
Copyright © 2013 TriFort, Inc. All Rights Reserved.
InnoDB
・インデックス追加 / 削除がオンラインで可能
・全文検索機能
・ .ibd ファイルのエクスポート・インポート
・ページサイズの指定 (4k/8k/16k)
・ memcached プロトコルでアクセス
・インデックス統計情報の改善
・ InnoDB のログサイズ最大が 4G⇒512G
・デッドロック検出機能の改善
・ SQL : START TRANSACTION READ ONLY
Copyright © 2013 TriFort, Inc. All Rights Reserved.
レプリケーション
・ SLAVE のマルチスレッド化
・ GTID で SLAVE の自動昇格が可能
・ SLAVE がクラッシュセーフに。
・遅延レプリケーション
・ SLAVE が使用する NIC の指定
・バイナリログにチェックサムの付与
Copyright © 2013 TriFort, Inc. All Rights Reserved.
オプティマイザ
・サブクエリの改善
・ UPDATE/DELETE/INSERT なども explain 可
能に
・ ORDER BY ... LIMIT のパフォーマンス改善
・パーティションの上限が 1024⇒8192 に増加
・パーティションをテーブル間で移動
・クエリ実行時にパーティションを指定できる
Copyright © 2013 TriFort, Inc. All Rights Reserved.
インデックスの理解
Copyright © 2013 TriFort, Inc. All Rights Reserved.
質問:インデックスを使うメリット
は
何でしょうか?
Copyright © 2013 TriFort, Inc. All Rights Reserved.
答え:レコードの絞り込みを高速に行える。
Copyright © 2013 TriFort, Inc. All Rights Reserved.
質問:インデックスを使うデメリットは
何でしょうか?
Copyright © 2013 TriFort, Inc. All Rights Reserved.
答え:更新が遅くなる。
使いすぎるとメモリを圧迫す
る。
Copyright © 2013 TriFort, Inc. All Rights Reserved.
インデックスとは何か
メモリに該当レコードの位置を保存して、高速にアクセ
スできるようにしています。
メモリは HDD の 10 万倍程度早いので、高速な検索を実
現しています。
Copyright © 2013 TriFort, Inc. All Rights Reserved.
インデックスの種類
質問: MySQL にはどのようなインデックス
が
存在するでしょうか?
Copyright © 2013 TriFort, Inc. All Rights Reserved.
・ PRIMARY KEY
⇒テーブルのレコードを一意に特定
・セカンダリインデックス
⇒ PK 以外のインデックス
・ユニークインデックス
⇒特定のカラムで同じ値が一度しか出現しな
くなる (NULL は除く )
Copyright © 2013 TriFort, Inc. All Rights Reserved.
・空間インデックス (SPATIAL)
⇒緯度軽度などの空間情報を扱うのに利用。 R-tree 。
・ FULLTEXT
⇒全文検索用のインデックス。 MySQL5.6 から
InnoDB で
使用可能になりました。
Copyright © 2013 TriFort, Inc. All Rights Reserved.
100 万レコードの検索
⇒ 全てのレコードを順番に読んで、 100 万回のレコー
ドチェックを行う。
インデックスを使用しないと・・
Copyright © 2013 TriFort, Inc. All Rights Reserved.
ヘッダブロック、ブランチブロックで値を検索し、
リーフブロックでレコードの位置を特定します。
B-tree index の概要
Copyright © 2013 TriFort, Inc. All Rights Reserved.
・どのようなキー値でも同一の速度が期待できる。
・大量データでも良いパフォーマンスが期待できる。
・主キーでの検索が非常に高速
・セカンダリインデックスの検索は遅くなる
⇒リーフブロックには主キーの位置が格納
B-tree インデックスの特徴
Copyright © 2013 TriFort, Inc. All Rights Reserved.
複合インデックスについて
質問: 2 つ以上のカラムにインデックスを張るとき、
気をつけるポイントは何でしょうか?
Copyright © 2013 TriFort, Inc. All Rights Reserved.
・どのように検索されるかを考慮する。
A, AB で検索される場合には A⇒B の順番。
B, BA で検索される場合には B⇒A の順番。
・カーディナリティ ( 値の分散 ) を考慮する。
A が 3 つのデータ、 B が 1000 のデータで構
成され
ている場合、 B を先に持ってくる。
Copyright © 2013 TriFort, Inc. All Rights Reserved.
・フィールド値を定数と比較するとき (where name =
'hogehoge')
・フィールド値で JOIN するとき (where a.name = b.name)
・フィールド値の範囲を求めるとき (<,>,between)
・ LIKE句が文字列から始まるとき (where name like 'hoge%')
・ min(),max()
・文字列のプレフィクスを基にした order by, groupy by
インデックスが使用されるとき
Copyright © 2013 TriFort, Inc. All Rights Reserved.
質問:どのインデックスを使用するか指定する方法
は?
Copyright © 2013 TriFort, Inc. All Rights Reserved.
答え: use index 文を使用する。
SELECT * FROM estimates
USE INDEX(IDX_IMPORT,
IDX_FSEARCH)
WHERE total>=10000 AND type=1
Copyright © 2013 TriFort, Inc. All Rights Reserved.
質問: explain 文で見るべき項目
は?
Copyright © 2013 TriFort, Inc. All Rights Reserved.
答え:
・適正なインデックスが使用されているか。
・テーブルに対するアクセス方法は適正か (type)
・ Extra のチェック (filesort, temporary に注
意! )
Copyright © 2013 TriFort, Inc. All Rights Reserved.
知っておきたい SQL
Copyright © 2013 TriFort, Inc. All Rights Reserved.
質問:複数の値を一括で insert する方法
は?
Copyright © 2013 TriFort, Inc. All Rights Reserved.
答え:バルク insert
Insert into table_name
values
(AAA, BBB, CCC, DDD),
(AAA, BBB, CCC, DDD),
(AAA, BBB, CCC, DDD)
Copyright © 2013 TriFort, Inc. All Rights Reserved.
質問:値の delete-insert を一回で行う方法
は?
Copyright © 2013 TriFort, Inc. All Rights Reserved.
答え: replace into
replace into table_name
values
(AAA, BBB, CCC, DDD)
Copyright © 2013 TriFort, Inc. All Rights Reserved.
質問: PK にレコードが存在したら update, 存在し
なかったら insert を行う方法は?
Copyright © 2013 TriFort, Inc. All Rights Reserved.
答え: on duplicate key update
Insert into table_name
values
(AAA, BBB, CCC)
on duplicate key update
column_A=AAA,
column_B=BBB,
column_C=CCC
Copyright © 2013 TriFort, Inc. All Rights Reserved.
質問: select したレコードをロックする方法は?
Copyright © 2013 TriFort, Inc. All Rights Reserved.
答え: select for update
select for update from table_name where
id=1;
⇩commit;
Copyright © 2013 TriFort, Inc. All Rights Reserved.
質問:クエリキャッシュを使わない指定方法は?
Copyright © 2013 TriFort, Inc. All Rights Reserved.
答え: SQL_NO_CACHE
select SQL_NO_CACHE from
table_name
where id=1;
Copyright © 2013 TriFort, Inc. All Rights Reserved.
質問: PK が同じレコードの重複登録エラー
を 無視して高速に INSERT する方法
は?
Copyright © 2013 TriFort, Inc. All Rights Reserved.
答え: INSERT IGNORE
INTO
Insert ignore into table_name
values
(AAA, BBB, CCC)
Copyright © 2013 TriFort, Inc. All Rights Reserved.
質問: insert された auto_increment 値の取
得方法
Copyright © 2013 TriFort, Inc. All Rights Reserved.
答え: last_insert_id();
Copyright © 2013 TriFort, Inc. All Rights Reserved.
質問: select の結果で重複している行を除外する
Copyright © 2013 TriFort, Inc. All Rights Reserved.
答え: DISTINCT
select distinct AAA from
table_name
Copyright © 2013 TriFort, Inc. All Rights Reserved.
勉強会は以上になります。ご清聴ありがとうございました。