(2008年11月GA)
8. 開発者視点でみたMySQL
8−1. Oracle開発者向けポイント(1 / 2)
SQL標準(JIS/ANSI/ISO準拠)にのっとっていない、Oracle特有のSQLがMySQLには通り ません。(外部結合の(+) 記号、Merge文、Decode関数等)
Oracleは「空文字 (ʼʼ)」と「NULL」が同じ扱いですが、MySQLは違うものとして扱われます。
MySQLはデータベース名とテーブル名の大文字小文字を区別する(Case Sensitive) 設定 があります。Unix系OSの場合、デフォルトでは区別する設定
(lower̲case̲table̲names =0)と なっていますので注意が必要です。尚、他のオブジェクト(カラム名やSP名等)は常に区別さ れません。Oracleでは全て区別されません。
①外部結合の(+) 記号は、Left Outer Join句で代替可能です。
②Merge文はReplace文で代替可能です。
(厳密にはDelete>Insertとなり若干動作が異なります。)
③Decode関数はCase文で代替する事が可能です。
【解決策】
【解決策】
大文字小文字を同一として扱いたい場合、「lower̲case̲table̲names =1」を指定 してください。尚、ディスク上のテーブルファイル名等は小文字で保存されます。
【解決策】
特に区別する要件がない場合は、アプリケーション全体で、「NULL」もしくは「空文
字列(ʼʼ)」のどちらかに統一する事で混乱が回避できます。
8−1. Oracle開発者向けポイント(2 / 2)
MySQLは数値型のPrimaryキーがない場合、Rowidが参照できません。
デフォルトのトランザクション分離レベルが異なります。Oracleは「Read Commited」、MySQL
(InnoDB)は「Repeatable Read」。
MySQL(InnoDB)は行ロックをサポートしますが、Update時のWhere句カラムにIndex張られて いない場合、テーブルロックとなるので注意が必要です。
MySQLアプリケーション開発や、マイグレーション時に、上記のような軽微な違いがクリティ カルとなる場合があるので注意が必要です。
【解決策】
Primaryキーは可能な限り数値型で設定してください。
【解決策】
MySQLの初期化パラメータ 「transaction-isolation = READ-COMMITTED」を設定する事で 標準分離レベルを「Read Commited」とすることが可能です。
また単一セッション内のみ変更する場合は、MySQLクライアントから
「SET TRANSACTION ISOLATION LEVEL READ COMMITTED」を発行する事で可能です。
【解決策】
Where句となりうるカラムには全てIndexを作成してください。
(総件数が少ないものはこの限りではないです。)
8−2.MySQL コネクタ
Connector/J
Connector/NET
Connector/PHP
クライアントプログラムから MySQLサーバへ接続するドライバである、MySQL コネクタについてご紹介します。
Connector/ODBC
MySQL用JDBCドライバです。JDBC APIを利用してMySQLへアクセスします。
GPLライセンスのオープンソースソフトウェアとして提供されています。
HibernateやSpringのようなフレームワークと連携して利用できます。
MySQL用ODBCドライバです。ODBC APIを利用してMySQLへアクセスします。
MS ACCESSからの利用も可能です。
.NET アプリケーション用のADO.NET ドライバです。ADO.NET インターフェイスを実装し、ADO.NET 対 応ツールを統合します。100% 純粋な C# で書かています。
また、MySQL Visual Studio プラグインも用意されていますので、Visual Studioにデータベース保守 ツールを組込む事も可能です。
PHP用の MySQL APIです。2つの異なるものを利用できます。(両方を同時に利用する事も可能)
Mysqlエクステンション : MySQL 4.1より前のバージョンで使用することを目的としたものです。
Mysqliエクステンション: MySQL 4.1以降のバージョンで使用でき、mysqlエクステンションよりオブ
ジェクト指向のプログラムインターフェースとなります。
8−3.MySQL 全文検索
「含む検索」(where col like ʻ%keyword%ʼ)はIndexが利用できないため、全表検索となり速度低下の原因となります。
MySQLが標準で持つFull TEXT Indexを利用する事(但しMyISAMのみ)で、全文検索が可能となりますが、標準では日本 語をサポートしていません。MySQLで日本語全文検索を利用したい場合、Tritonnを導入する事で可能となります。
3table結合時(300万件+ 900万件+900件) 条件table単体(300万件)
参考処理速度 Mysql 5.0.67
0.17 sec 0.09 sec
検索キーワード1文字
0.01 sec 0.02 sec
検索キーワード2文字
検索対象キーワードは、 Wikipediaのタイトル100万語から頭9文字を切り出し登録。3倍に増幅(300万件)してN-gram方式 でIndex登録した。登録テーブルに対して、全文検索を行い、5行をランダムで抽出した場合の速度。ハードウェア環境につい ては「 1−3. 」と同様の環境となります。
参考速度(Tritonn利用時)
Tritonn (SennaのMySQLバインディング)について
全文検索エンジンである「Senna」をMySQLに組込みこんだTritonnを利用する事で、標準のFull Text Index検索用SQLで日本語全文検索が可能となります。日本語全文検索は主に2つの方式があります。
形態素解析方式:辞書登録された形態素(単語)で分ち書きを行う方式です。「MeCab」エンジンを利用します。
辞書のメンテが必要となります。形態素に一致しない単語は検索されませんが、適合率が高 いです。(ユーザの意図しない検索結果が出にくい)
N-Gram方式 :単語を「N文字」ずつ分割してIndex登録する方式です。検索時の条件も同じように分割して Indexスキャンするため全て検索されますが、ユーザが意図しないキーワードが検索結果として 表示される可能性があります。(例:「京都」で検索した場合に、「東京都」も検索される。)
Tritonnプロジェクト URL:http://qwik.jp/tritonn/
【参考資料】 その他サードパーティ製品
InnoDB Hot Backup
InnoDB のホットバックアップ用ツール
− ソフトウェアライセンスとサポートサービス
Sunより購入可能 (SLAはInnobase社の定義)http://www.innodb.com/wp/products/hot-backup/
ZRM − Zmanda Recovery Manager
Web管理コンソールを備えたバックアップユーティリティソフトウェア ストレージエンジン毎に最適なバックアップ方法を選択
バックアップ時の圧縮・暗号化にも対応
Sunより購入可能http://www-jp.mysql.com/products/backup/zrm.html
DRBD Plus
DRBDの拡張パッケージで有償版。
最大3台までのコンピュータのディスク内容をリアルタイムでミラーする、
Linux向けのソフトウェアソリューション。比較的低速なWAN回線でのミラーリング に対する最適化機能も備えており、ローコストにディザスタリカバリ・システムを 構築できます。
SmartStyleより購入可能
http://www.s-style.co.jp/mysql̲support̲service/mysql̲ha/drbd.html
【参考資料】MySQLライセンスの比較
Knowledge Base Enterprise
Monitor ライセンスへ 課金単位
専用バイナリ の同梱 InnoDB
ライセンス 課金単位 商用
ライセンス
○
○ サーバ
同梱
○
(サーバ) ○
○ ※1 MySQL Enterprise
○
○ サーバ
同梱
○
(サーバ) ○
× ※1 MySQL Enterprise
(GPL)
追加機能/サービス 年間サポート
バイナリ ライセンス
※1 MySQL Enterpriseは技術サポートとライセンスが一体の年間サブスクリプションです。
標準ではGPLライセンスのバイナリを提供する。追加費用なしでGPLを外す事も可能(商用ライセンスのバイナリの利用)
GPLを外す場合、手続きに3〜4週程度の期間がかかる。
・VMwareなど、仮想で複数OSを持つサーバでは、MySQLが動作する仮想OS毎にライセンス購入が必要。
・ブレードサーバは1台(1エンクロージャ)につき、1ライセンスとなる。但し、上記の仮想OSの考え方と同様に、MySQLが動作する OSがブレードサーバ内に複数稼動していれば、稼動OS分だけライセンスが必要となる。
・Coldスタンバイ、Hotスタンバイにかかわらず、物理的に1サーバであれば、1ライセンスとしてカウントする。
・仮想環境、またはブレードサーバにおいては、Coldスタンバイ分はカウントされない。同時稼動するOS数分だけライセンスが必要となる。
MySQL Enterprise Server
・有償顧客専用バイナリ
※SUN:「標準はGPLライセンス → 無償で商用ライセンスに変更可能」
MySQL Enterprise Monitor (日本語版あり) MySQL統合監視ツール
技術サポート
・英 語・・・レベル分けにより24×7 対応
・日本語・・・2008年4月9日より、日本法人にて日本語で応対開始(平日9:00〜17:00)
メンテナンスアップデート
アップデートアラート・テクニカルアラート
Knowledge Base : ナレッジベース
Indemnification : 知財(著作権や商標が管理されているため)訴訟に関する補償
基本価格体系
・サーバー数・年単位
商用ライセンスを選択した場合でも、契約期間終了時点で契約を更新していなければ、
ライセンスは自動的にGPLに切り替わるので注意ください。
【参考資料】MySQL Enterprise 詳細
Webアプリやエンタープライズ環境向けサービスの年間サブスクリプション契約。
サブスクリプションのサービスレベルはBasic, Silver, Gold, Plutinumの4種類
【参考資料】ライセンス単位課金の計算方式について(2009年4月確認)
サーバ単位課金ライセンスの計算方法について
①サーバに搭載されるCPU数及びコア数についての考え方
1サーバあたりのコア数やCPU数に制限はない。但し、複数CPUを積んでもリニアにスケールとは限らない。
②仮想環境(VMWare、Xen、HyperV等)の考え方
1サーバホスト上に、MySQLが稼動する複数の仮想OSがある場合、MySQLが稼動する仮想OSの数分カウントする。
但し、Coldスタンバイ用の仮想OSのように通常稼動していない仮想OSの考え方は、同時に稼動している仮想OS数となる。
(Hotスタンバイ機は「同時に稼動している仮想OS」に含まれる。)
例: 1サーバホストに、仮想OSとして以下が稼動している場合、5ライセンスの購入が必要 Windows2000server × 1 ⇒1ライセンス
Windows2003server × 1 ⇒1ライセンス
RHEL5.2 × 2 (Coldスタンバイが1) ⇒1ライセンス SUSE Linux Enterprise 11 ×2(Hotスタンバイが1) ⇒2ライセンス
③ブレードサーバの考え方
ブレード1枚単位ではなく、エンクロージャ単位で1サーバとする。
但し、1サーバ内で稼動OSが複数ある場合は、上記の仮想環境と同じ考え方が適用される。
⇒同時に稼動しているOS数分のライセンス購入
④スタンバイ機について
Coldスタンバイ、Hotスタンバイにかかわらず、物理的に1サーバであれば、1ライセンスとしてカウントする。
この場合、上記仮想環境の考え方と異なり、同時に稼動しているOS数とはならない。
但し、スタンバイ機用の価格割引ライセンスが存在する。
現在変更されている可能性もありますので、ご購入検討時に再確認いたします。