61
Copyright © 2013 TriFort, Inc. All Rights Reserved. MySQL 勉勉勉 勉勉勉勉勉 勉勉勉勉勉勉 勉勉 勉勉

【基礎編】社内向けMySQL勉強会

Embed Size (px)

DESCRIPTION

社内で行ったMySQL勉強会の資料です。 コンテンツは下記になります。 ・MySQLの概要 ・バージョンと新機能 ・インデックスについて ・知っておきたいSQL

Citation preview

Page 1: 【基礎編】社内向けMySQL勉強会

Copyright © 2013 TriFort, Inc. All Rights Reserved.

MySQL 勉強会〜基礎編〜

技術統轄本部大谷 祐司

Page 2: 【基礎編】社内向けMySQL勉強会

Copyright © 2013 TriFort, Inc. All Rights Reserved.

MySQL 勉強会

TriFort で標準 DB として採用されている

MySQL 。

基本的な内容から応用的な内容まで、幅広く

お届けしたいと思います。

Page 3: 【基礎編】社内向けMySQL勉強会

Copyright © 2013 TriFort, Inc. All Rights Reserved.

アジェンダ

・ MySQL の概要

・バージョンと新機能

・インデックスについて

・知っておきたい SQL

Page 4: 【基礎編】社内向けMySQL勉強会

Copyright © 2013 TriFort, Inc. All Rights Reserved.

MySQL の概要

Page 5: 【基礎編】社内向けMySQL勉強会

Copyright © 2013 TriFort, Inc. All Rights Reserved.

世界で一番使われているオープンソース・データベース

Page 6: 【基礎編】社内向けMySQL勉強会

Copyright © 2013 TriFort, Inc. All Rights Reserved.

MySQL の運営組織

1995 年: MySQL AB によってリリース

2008 年:サン・マイクロシステムズが MySQL AB 買収

2009 年:オラクルがサン・マイクロシステムズ買収

現在は、オラクルが MySQL を開発している。

Page 7: 【基礎編】社内向けMySQL勉強会

Copyright © 2013 TriFort, Inc. All Rights Reserved.

MySQL の fork 「 MariaDB 」の台頭

Fedora19 がリリース。

デフォルトの DB が MySQL から MariaDB に変更されました。

2013 年 7 月

Page 8: 【基礎編】社内向けMySQL勉強会

Copyright © 2013 TriFort, Inc. All Rights Reserved.

Google も MariaDB 採用へ

社内データベースに MariaDB 10.0 を採用している。

Google が MariaDB Foundation に開発者を派遣。

Page 9: 【基礎編】社内向けMySQL勉強会

Copyright © 2013 TriFort, Inc. All Rights Reserved.

MySQL の歴史

Page 10: 【基礎編】社内向けMySQL勉強会

Copyright © 2013 TriFort, Inc. All Rights Reserved.

1995 年 5 月

最初のバージョンがリリース。

Page 11: 【基礎編】社内向けMySQL勉強会

Copyright © 2013 TriFort, Inc. All Rights Reserved.

2003 年 3 月

バージョン 4.0 プロダクション版

リリース

Page 12: 【基礎編】社内向けMySQL勉強会

Copyright © 2013 TriFort, Inc. All Rights Reserved.

・クエリキャッシュ

・バルクインサート

・ InnoDB ストレージエンジン

・ SQL : TRUNCATE 文

・ SQL : UNION 文

・ SET 文が使えるようになった

・複数テーブルの DELETE/UPDATE

・ FOUND_ROWS

Page 13: 【基礎編】社内向けMySQL勉強会

Copyright © 2013 TriFort, Inc. All Rights Reserved.

2004 年 10 月

バージョン 4.1 プロダクション版

リリース

Page 14: 【基礎編】社内向けMySQL勉強会

Copyright © 2013 TriFort, Inc. All Rights Reserved.

・サブクエリのサポート

・ SQL : CREATE TABLE XXX LIKE XXX

・ SSL 接続を介したレプリケーション

・ SQL : ON DUPLICATE KEY UPDATE

・ 1 度に複数クエリの実行

・ GROUP_CONCAT() 関数

Page 15: 【基礎編】社内向けMySQL勉強会

Copyright © 2013 TriFort, Inc. All Rights Reserved.

2005 年 10 月バージョン 5 プロダクション版

リリース

Page 16: 【基礎編】社内向けMySQL勉強会

Copyright © 2013 TriFort, Inc. All Rights Reserved.

・ストアドプロシージャ

・ VARCHAR の 255 文字以上対応

Page 17: 【基礎編】社内向けMySQL勉強会

Copyright © 2013 TriFort, Inc. All Rights Reserved.

2008 年 11 月バージョン 5.1 プロダクション版

リリース

Page 18: 【基礎編】社内向けMySQL勉強会

Copyright © 2013 TriFort, Inc. All Rights Reserved.

・テーブルのパーティショニング

・行ベースのレプリケーション

・プラグイン API

・イベント スケジューラ

・サーバログテーブル

・テーブルスペースのバックアップ

(mysqldump)

・ INFORMATION_SCHEMA に対する改良

Page 19: 【基礎編】社内向けMySQL勉強会

Copyright © 2013 TriFort, Inc. All Rights Reserved.

2010 年 12 月バージョン 5.5 プロダクション版

リリース

Page 20: 【基礎編】社内向けMySQL勉強会

Copyright © 2013 TriFort, Inc. All Rights Reserved.

・標準ストレージエンジンが InnoDB に変

更。

・ InnoDB の大幅な改善

・準同期レプリケーション

・レプリケーションの改善

・ 4 バイト UTF-8 対応

・ RANGE/LIS パーテショニング

Page 21: 【基礎編】社内向けMySQL勉強会

Copyright © 2013 TriFort, Inc. All Rights Reserved.

2013 年 2 月バージョン 5.6 プロダクション版

リリース

Page 22: 【基礎編】社内向けMySQL勉強会

Copyright © 2013 TriFort, Inc. All Rights Reserved.

InnoDB

・インデックス追加 / 削除がオンラインで可能

・全文検索機能

・ .ibd ファイルのエクスポート・インポート

・ページサイズの指定 (4k/8k/16k)

・ memcached プロトコルでアクセス

・インデックス統計情報の改善

・ InnoDB のログサイズ最大が 4G⇒512G

・デッドロック検出機能の改善

・ SQL : START TRANSACTION READ ONLY

Page 23: 【基礎編】社内向けMySQL勉強会

Copyright © 2013 TriFort, Inc. All Rights Reserved.

レプリケーション

・ SLAVE のマルチスレッド化

・ GTID で SLAVE の自動昇格が可能

・ SLAVE がクラッシュセーフに。

・遅延レプリケーション

・ SLAVE が使用する NIC の指定

・バイナリログにチェックサムの付与

Page 24: 【基礎編】社内向けMySQL勉強会

Copyright © 2013 TriFort, Inc. All Rights Reserved.

オプティマイザ

・サブクエリの改善

・ UPDATE/DELETE/INSERT なども explain 可

能に

・ ORDER BY ... LIMIT のパフォーマンス改善

・パーティションの上限が 1024⇒8192 に増加

・パーティションをテーブル間で移動

・クエリ実行時にパーティションを指定できる

Page 25: 【基礎編】社内向けMySQL勉強会

Copyright © 2013 TriFort, Inc. All Rights Reserved.

インデックスの理解

Page 26: 【基礎編】社内向けMySQL勉強会

Copyright © 2013 TriFort, Inc. All Rights Reserved.

質問:インデックスを使うメリット

   何でしょうか?

Page 27: 【基礎編】社内向けMySQL勉強会

Copyright © 2013 TriFort, Inc. All Rights Reserved.

答え:レコードの絞り込みを高速に行える。

Page 28: 【基礎編】社内向けMySQL勉強会

Copyright © 2013 TriFort, Inc. All Rights Reserved.

質問:インデックスを使うデメリットは

   何でしょうか?

Page 29: 【基礎編】社内向けMySQL勉強会

Copyright © 2013 TriFort, Inc. All Rights Reserved.

答え:更新が遅くなる。

   使いすぎるとメモリを圧迫す

る。

Page 30: 【基礎編】社内向けMySQL勉強会

Copyright © 2013 TriFort, Inc. All Rights Reserved.

インデックスとは何か

メモリに該当レコードの位置を保存して、高速にアクセ

スできるようにしています。

メモリは HDD の 10 万倍程度早いので、高速な検索を実

現しています。

Page 31: 【基礎編】社内向けMySQL勉強会

Copyright © 2013 TriFort, Inc. All Rights Reserved.

インデックスの種類

質問: MySQL にはどのようなインデックス

   存在するでしょうか?

Page 32: 【基礎編】社内向けMySQL勉強会

Copyright © 2013 TriFort, Inc. All Rights Reserved.

・ PRIMARY KEY

 ⇒テーブルのレコードを一意に特定

・セカンダリインデックス

 ⇒ PK 以外のインデックス

・ユニークインデックス

 ⇒特定のカラムで同じ値が一度しか出現しな

 くなる (NULL は除く )

Page 33: 【基礎編】社内向けMySQL勉強会

Copyright © 2013 TriFort, Inc. All Rights Reserved.

・空間インデックス (SPATIAL)

 ⇒緯度軽度などの空間情報を扱うのに利用。 R-tree 。

・ FULLTEXT

 ⇒全文検索用のインデックス。 MySQL5.6 から

InnoDB で

  使用可能になりました。

Page 34: 【基礎編】社内向けMySQL勉強会

Copyright © 2013 TriFort, Inc. All Rights Reserved.

100 万レコードの検索

⇒ 全てのレコードを順番に読んで、 100 万回のレコー

ドチェックを行う。

インデックスを使用しないと・・

Page 35: 【基礎編】社内向けMySQL勉強会

Copyright © 2013 TriFort, Inc. All Rights Reserved.

ヘッダブロック、ブランチブロックで値を検索し、

リーフブロックでレコードの位置を特定します。

B-tree index の概要

Page 36: 【基礎編】社内向けMySQL勉強会

Copyright © 2013 TriFort, Inc. All Rights Reserved.

・どのようなキー値でも同一の速度が期待できる。

・大量データでも良いパフォーマンスが期待できる。

・主キーでの検索が非常に高速

・セカンダリインデックスの検索は遅くなる

 ⇒リーフブロックには主キーの位置が格納

B-tree インデックスの特徴

Page 37: 【基礎編】社内向けMySQL勉強会

Copyright © 2013 TriFort, Inc. All Rights Reserved.

複合インデックスについて

質問: 2 つ以上のカラムにインデックスを張るとき、

   気をつけるポイントは何でしょうか?

Page 38: 【基礎編】社内向けMySQL勉強会

Copyright © 2013 TriFort, Inc. All Rights Reserved.

・どのように検索されるかを考慮する。

  A, AB で検索される場合には A⇒B の順番。

  B, BA で検索される場合には B⇒A の順番。

・カーディナリティ ( 値の分散 ) を考慮する。

  A が 3 つのデータ、 B が 1000 のデータで構

成され

 ている場合、 B を先に持ってくる。

Page 39: 【基礎編】社内向けMySQL勉強会

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

インデックスが使用されるとき

Page 40: 【基礎編】社内向けMySQL勉強会

Copyright © 2013 TriFort, Inc. All Rights Reserved.

質問:どのインデックスを使用するか指定する方法

は?

Page 41: 【基礎編】社内向けMySQL勉強会

Copyright © 2013 TriFort, Inc. All Rights Reserved.

答え: use index 文を使用する。

SELECT * FROM estimates

USE INDEX(IDX_IMPORT,

IDX_FSEARCH)

WHERE total>=10000 AND type=1

Page 42: 【基礎編】社内向けMySQL勉強会

Copyright © 2013 TriFort, Inc. All Rights Reserved.

質問: explain 文で見るべき項目

は?

Page 43: 【基礎編】社内向けMySQL勉強会

Copyright © 2013 TriFort, Inc. All Rights Reserved.

答え:

・適正なインデックスが使用されているか。

・テーブルに対するアクセス方法は適正か (type)

・ Extra のチェック (filesort, temporary に注

意! )

Page 44: 【基礎編】社内向けMySQL勉強会

Copyright © 2013 TriFort, Inc. All Rights Reserved.

知っておきたい SQL

Page 45: 【基礎編】社内向けMySQL勉強会

Copyright © 2013 TriFort, Inc. All Rights Reserved.

質問:複数の値を一括で insert する方法

は?

Page 46: 【基礎編】社内向けMySQL勉強会

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)

Page 47: 【基礎編】社内向けMySQL勉強会

Copyright © 2013 TriFort, Inc. All Rights Reserved.

質問:値の delete-insert を一回で行う方法

は?

Page 48: 【基礎編】社内向けMySQL勉強会

Copyright © 2013 TriFort, Inc. All Rights Reserved.

答え: replace into

replace into table_name

values

(AAA, BBB, CCC, DDD)

Page 49: 【基礎編】社内向けMySQL勉強会

Copyright © 2013 TriFort, Inc. All Rights Reserved.

質問: PK にレコードが存在したら update, 存在し

なかったら insert を行う方法は?

Page 50: 【基礎編】社内向けMySQL勉強会

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

Page 51: 【基礎編】社内向けMySQL勉強会

Copyright © 2013 TriFort, Inc. All Rights Reserved.

質問: select したレコードをロックする方法は?

Page 52: 【基礎編】社内向けMySQL勉強会

Copyright © 2013 TriFort, Inc. All Rights Reserved.

答え: select for update

select for update from table_name where

id=1;

  ⇩commit;

Page 53: 【基礎編】社内向けMySQL勉強会

Copyright © 2013 TriFort, Inc. All Rights Reserved.

質問:クエリキャッシュを使わない指定方法は?

Page 54: 【基礎編】社内向けMySQL勉強会

Copyright © 2013 TriFort, Inc. All Rights Reserved.

答え: SQL_NO_CACHE

select SQL_NO_CACHE from

table_name

where id=1;

Page 55: 【基礎編】社内向けMySQL勉強会

Copyright © 2013 TriFort, Inc. All Rights Reserved.

質問: PK が同じレコードの重複登録エラー

を   無視して高速に INSERT する方法

は?

Page 56: 【基礎編】社内向けMySQL勉強会

Copyright © 2013 TriFort, Inc. All Rights Reserved.

答え: INSERT IGNORE

INTO

Insert ignore into table_name

values

(AAA, BBB, CCC)

Page 57: 【基礎編】社内向けMySQL勉強会

Copyright © 2013 TriFort, Inc. All Rights Reserved.

質問: insert された auto_increment 値の取

得方法

Page 58: 【基礎編】社内向けMySQL勉強会

Copyright © 2013 TriFort, Inc. All Rights Reserved.

答え: last_insert_id();

Page 59: 【基礎編】社内向けMySQL勉強会

Copyright © 2013 TriFort, Inc. All Rights Reserved.

質問: select の結果で重複している行を除外する

Page 60: 【基礎編】社内向けMySQL勉強会

Copyright © 2013 TriFort, Inc. All Rights Reserved.

答え: DISTINCT

select distinct AAA from

table_name

Page 61: 【基礎編】社内向けMySQL勉強会

Copyright © 2013 TriFort, Inc. All Rights Reserved.

勉強会は以上になります。ご清聴ありがとうございました。