MySQL (TM)
ソフトウェアはとても高速で、マルチスレッド、マルチユーザの、頑丈な SQL
(Structured Query Language
)データベースサーバです。
MySQL Server
は、大量に配備されるフトウェアへ組み込まれるときと同じように、
ミッションクリティカルで高負荷な生産システム用に意図されています。
MySQL
は MySQL AB
の商標です。
MySQL
ソフトウェア は デュアルライセンス
です。
あなたは、MySQL
を GNU GENERAL PUBLIC LICENSE
(http://www.gnu.org/licenses/) にしたがって、
Open Source
/Free Software
として利用できます。
あるいは、GPL の条件が合わない場合には、
コマーシャルライセンスを MySQL AB
から購入することも可能です。
「1.4 MySQL ライセンスとサポート」節参照.
MySQL
ウェブサイト (http://www.mysql.com/) には MySQL
ソフトウェア
についての最新情報があります。
次のリストはマニュアルのなかで特に興味を引くいくつかの節を説明しています:
MySQL Database Server
の背景にある会社についての情報は、 「1.3 MySQL AB とは何か」節 を
参照してください。
MySQL Database Server
の能力の説明については、 「1.2.2 MySQL の主な機能」節 を参照してください。
MySQL Database Software
を新しいアーキテクチャや OS に移行するためのヒントについては
「E 他のシステムへの移植について」節 を参照してください。
MySQL Database Server
導入のチュートリアルについては、 「3 Tutorial Introduction」節 を参照してください。
SQL
の例とベンチマーク情報についてはベンチマーキングのディレクトリを参照
してください。(`sql-bench' ディレクトリです)
重要:
エラー(バグ)レポート、質問、コメントは メーリングリスト mysql@lists.mysql.com に送ってください。 「1.6.1.3 バグや問題を報告する方法」節参照。
バグレポートを生成するためには mysqlbug
スクリプトを使用すべきです。
ソースディストリビューションでは、mysqlbug
スクリプトは `scripts' ディレクトリ
に見つけることができます。バイナリディストリビューションでは、mysqlbug
は
`bin' ディレクトリ(MySQL-server
RPM パッケージでは `/usr/bin') に見つけることができます。
MySQL Server
のセキュリティバグを発見した場合は、
security@mysql.com に email を送ってください。
これは MySQL
のリファレンスマニュアルです; これは
MySQL
バージョン 4.0.12 について記述しています。
機能上の変更は、かならずそのバージョンを示されます。
そのため、MySQL
ソフトウェアの古いバージョンを使っていても、
このマニュアルは通用します。
これはリファレンスマニュアルであるので、一般的な SQL
やリレーショナルデータベース概念の説明書ではありません。
MySQL Database Software
は発展中なので、マニュアルは頻繁に更新されます。そのため、
オンラインで参照しない限り、このバージョンが期限切れである可能性があります。
このマニュアルの最新バージョンは http://www.mysql.com/documentation/ に多
様な形式で置いてあります。
このマニュアルは現在 HTML, PDF, Windows HLP バージョンがあります。
プライマリドキュメントは Texinfo ファイルです。HTML バージョンは
texi2html
の変更されたバージョンで自動的に提供されます。プレーン
テキストと Info バージョンは makeinfo
で提供されます。PostScript
バージョンは texi2dvi
と divps
を使用して提供されます。PDF
バージョンは pdftex
で提供されます。
マニュアル内の情報を見つけるのがつらいなら、 検索可能なバージョン http://www.mysql.com/doc/ を 試せます。
このマニュアルへの追加または修正に関連する提案がある場合には、それらを マニュアルチーム docs@mysql.com に 送ってください。
このマニュアルは当初、David Axmark, Michael (Monty) Widenius によって書かれました。 現在は Michael (Monty) Widenius, Arjen Lentz, Paul DuBois によって維持されています。他の貢献者については 「C Credits」節 を参照してください。
日本語訳は、以下の方々により行われました。 (ハンドル名だけ書きます。敬称略。翻訳サーバに登録した順 :) ):
このマニュアルの著作権(2003)は、スウェーデンの会社
MySQL AB
が所有しています。 「1.4.2 Copyrights and Licenses Used by MySQL」節参照.
このマニュアルは特定の印刷上の表記を使用しています:
constant
mysqladmin
がどのように動作するかを見るためには、
--help
オプションをつけて起動してください。''
コマンドが特定のプログラムによって実行されることを意味することを表すときには、
コマンドと共に表示されるプロンプトによって、そのプログラムを表します。例えば、
shell>
は、あなたのログインシェルから実行するコマンドを表し、
mysql>
は mysql
クライアントプログラムから実行するコマンドを表します:
シェルコマンドは Bourne シェル構文で示されます。csh
形式のシェ
ルを使用している場合は、わずかに変更してコマンドを発行する必要があるでしょ
う。例えば、環境変数を設定してコマンドを実行するシーケンスは、Bourne シェ
ル構文では次のようになります:
shell> VARNAME=value some_command
csh
では、次のようなシーケンスを実行してください:
shell> setenv VARNAME value shell> some_command
データベース名、テーブル名、フィールド名はコマンドの中で置換しなければいけない
ことがよくあります。このような置換が必要なことを示すために、このマニュア
ルは db_name
、tbl_name
、col_name
を使用します。
例えば、次のような文を見た場合:
mysql> SELECT col_name FROM db_name.tbl_name;
これは、同様の文を入力するためには、おそらく次のように、あな た自身のデータベース名, テーブル名, フィールド名を与えることを意味します:
mysql> SELECT author_name FROM biblio_db.author_list;
SQL 文は大文字でも小文字でも記述できます。このマニュアルで は大文字で記述します。
構文の説明中では、角括弧(`[' と `]')はオプションの単語や節であ
ることを示すために使用されます。次の文、IF EXISTS
はオプションです:
DROP TABLE [IF EXISTS] tbl_name
構文要素がいくつかのものからなる場合、垂直バー(`|')で区切られます。 選択セットから一つのメンバを選ぶことができるときは、角括弧中に列挙され ます。(`[' と `]'):
TRIM([[BOTH | LEADING | TRAILING] [remstr] FROM] str)
選択セットから一つのメンバを選ぶ必要があるときは、波括弧(`{' と `}')中に列挙されます:
{DESCRIBE | DESC} tbl_name {col_name | wild}
MySQL
は、もっとも有名な オープンソース
SQLデータベースで、
MySQL AB
によって開発、供給されています。MySQL AB
は
MySQL
データベースに関わるサービスを提供するビジネスを構築する
営利会社です。 「1.3 MySQL AB とは何か」節参照.
MySQL
ウェブサイト(http://www.mysql.com/)は、MySQL
と MySQL AB
に
ついての最新情報を提供しています。
MySQL
はデータベース管理システムです。
MySQL
サーバのようなデータベース管理システムが必要です。コンピュー
タは大量のデータの処理がたいへん得意なので、データベース管理システムは
単独で動作するユーティリティや他のアプリケーションの一部として、コンピュー
タの中で中心的な役割を演じています。
MySQL
の SQL
部分は "構造化問合せ
言語 (Structured Query Language
)" を表しています。これは、データベー
スのアクセスに使用される最も有名な標準言語です。
オープンソース
です。
オープンソース
の意味は誰でも使用し変更することができるということです。誰
でも MySQL
ソフトウェアをインターネットからダウンロードし、無償で使
えます。その気があれば誰でも必要に応じてソースコードを調べ、
変更できます。MySQL
ソフトウェア は GPL
(GNU General Public License
)
http://www.gnu.org/licenses/ にしたがいます。これは、様々な状況でそ
のソフトウェアで行えることと行えないことを定義しています。もし GPL
を嫌だと感じていたり、MySQL
を商用アプリケーションに組み込む必
要があるなら、商用ライセンス版を私たちから購入することができます。
「1.4.3 MySQL Licenses」節参照.
MySQL Database Server
はとても速く、信頼でき、簡単に使用できます。それがあなた
が探しているものなら、試してみるべきです。MySQL Server
は、私たちのユー
ザと協力して開発されたとても実用的な機能がひとそろいあります。私たちのベ
ンチマークページ上で、MySQL Server
と他のいくつかのデータベース管理シ
ステムの性能比較を見つけることができます。 「5.1.4 The MySQL Benchmark Suite」節参照.
MySQL Server
は、既存のソリューションよりも速く、とても大きなデータベー
スを処理するために独自に開発され、そして、高い需要がある実運用環境で何年間もの使用に耐え
てきました。不断の開発下で、MySQL Server
は今日、
豊富でとても有用な機能セットを提供します。MySQL は、結合性、速
度、セキュリティでインターネット上でのデータベースアクセスに高く適合しま
す。
MySQL Database Software
は、様々なバッ
クエンドをサポートするマルチスレッド SQL
サーバ、いくつかのクライアント
プログラム、ライブラリ、管理ツール、プログラミングインタフェース(API
)から成る
クライアント/サーバシステムです。
また、MySQL サーバ
をアプリケーションに
リンクできるマルチスレッドライブラリとしても提供していて、これにより、
より小さく、速く、管理しやすい製品が作れます。
MySQL Database Server
をサポートする、あなたの好きなアプリケー
ション/言語を見つけることができるでしょう。
MySQL
の公式な発音は ``My Ess Que Ell'' です(MY-SEQUEL ではあり
ません)。
しかし MY-SEQUEL と発音する人を正すことは避けています。
最初は、私たち自身の速くて低レベルな (ISAM) ルーチンを使用したテーブルへ
接続するために、 mSQL
を使用するつもりでした。
しかし、いくつかのテストの後、私たちは
mSQL
は私たちが必要とするほど高速ではなく、柔軟でないという
結論に至りました。この結果、mSQL
とほとんど同じ API インタフェー
スをもつ、私たちのデータベースへの新しい SQL インタフェースに帰結しました。
この API はサードパーティコードの移植を簡単にするために選択されました。
MySQL
の名前の由来は完全には明らかではありません。私たちのベース
ディレクトリと多くのライブラリとツールは接頭辞 ``my'' を 10 年以上も使っ
ています。しかし、Monty の娘(何年か若い)も My という名前です。そのため、
この2つのどちらが MySQL
に名前を与えたかは、私たちにとっても未だ
謎です。
MySQL Database Software
の重要な特徴のいくつかを以下の項目に挙げます。
「1.5 MySQL 4.x はやわかり」節参照.
MySQL
は市販のメモリリーク検出製品 Purify と、
Valgrind とよばれる GNU のツール(http://developer.kde.org/~sewardj/) で
テストされています。
FLOAT
, DOUBLE
, CHAR
, VARCHAR
,
TEXT
, BLOB
, DATE
, TIME
, DATETIME
,
TIMESTAMP
, YEAR
, SET
, ENUM
型.
「6.2 フィールド型」節参照.
INSERT
を使用でき、明示的に値が与えられていないフィールドはそのデ
フォルト値が設定されます。
SELECT
と WHERE
節で全ての演算子と関数が使えます。例:
mysql> SELECT CONCAT(first_name, " ", last_name) -> FROM tbl_name -> WHERE income/dependents > 10000 AND age > 30;
GROUP BY
と ORDER BY
節の完全なサポート。グループ関数
(COUNT()
, COUNT(DISTINCT ...)
,
COUNT(DISTINCT ...)
,
AVG()
, STD()
,
SUM()
, MAX()
and MIN()
) のサポート。
LEFT OUTER JOIN
とRIGHT OUTER JOIN
が使えます。
DELETE
, INSERT
, REPLACE
, UPDATE
は
変更された(影響を受けた)行の数を返します。
サーバ接続時にフラグを設定することにより、代わりに適合したレコード数を返す
ことも可能です。
MySQL
固有の SHOW
コマンドはデータベース、テーブル、イン
デックスについての情報を取出すために使用できます。EXPLAIN
コマン
ドはオプティマイザがどのようにクエリを解析するかを決定するために使用
できます。
ABS
は正しいフィールド
名です。制限は、関数呼び出しに、関数名とそれに続く `(' の間に空白が
許されないことだけです。 「6.1.7 Is MySQL Picky About Reserved Words?」節参照.
MySQL Server
を使用しているユーザを知っています。
MySQL Server
のコンパイル時に変更できます)。インデックスは
CHAR
または VARCHAR
フィールドの先頭部分を使用できます。
MySQL
サーバと接続します。
ODBC
(Open-DataBase-Connectivity) (ソースつき)。全ての ODBC
2.5 関数と他の多く。あなたの MySQL
サーバに接続するために、例え
ば Access を使用できます。 「8.3 MySQL ODBC サポート」節参照.
MySQL
サーバ起動時に、選択されたキャラクタセットに
にしたがって行われます。(デフォルトは、スウェーデン語の方法)。
ソース内に新しいソート順序配列を追加することで、こ
れは変更可能です。とても先進的なソートの例を見るには、Czech ソートコード
を見てください。 MySQL Server
は多くの種類のキャラクタセットをサポート
し、コンパイル時や実行時に指定できます。
myisamchk
を含んでいます。これは、テーブル検査、最適化、修復のため
のとても速いユーティリティです。
myisamchk
のすべての機能は、SQLインタフェースからも使えます。
「4 データベース管理」節参照.
MySQL
プログラムは
--help
と -?
オプションでオンラインヘルプを呼び出せます。
この節では、``MySQL Server はどれくらい安定か?'' と ``私はこのプロジェ クトの MySQL Server に依存できるか?'' という質問について回答します。
私たちはここで、いくつかの問題を明らかにし、多くの人に関係すると思われるさ らに重要な質問のいくつかを回答することを試みます。この節は、メーリングリ スト(そこではとても活発にバグが報告されています)から取り込まれた情報が一 緒に置かれています。
80年代初期からあるオリジナルのコードの中心部は、安定したコードの基礎とな
っています。ISAMテーブル形式は、後方互換性が保たれています。TcX
(MySQL AB
の前身)では、MySQL
は 1996 中頃から私たちのプロジ
ェクトで何の問題もなく動いていました。MySQL Database Software
が
広く公にリリースされたとき、私たちは、MySQL 内に ``テストされていないコード
'' の部分があることに注意しました。これは、私たちとは異なる方法でクエリを
作成する新しいユーザによってすぐに見つけられました。新しい各リリースは、
(多くの新しい機能を持っているのに)前のものよりも問題は少なくなります。そ
して次のリリースの一つを ``安定'' と呼ぶことができるように私たちは望んでい
ます。
MySQL Server
の各リリースは実用的で、ユーザが ``グレイゾーン'' か
らのコードの使用を開始するときにだけ問題があります。当然、外部のユーザは、
何がグレイゾーンかを知ることができません; この節で現在知られているこれら
を示してみます。説明は MySQL Server
の 3.23.x バージョンで扱われ
ます。知られていて報告されているバグは全て最新のバージョンで修正されてい
ます。バグ節に書かれているバグは除きます。それらは ``設計'' 関連のもので
す。 「1.7.5 MySQLでの既知のエラーと欠けているデザイン」節参照.
MySQL Server
は複数の階層と様々な独立モジュールで書かれています。
これらのモジュールは、それぞれがどのようにテストされているかとともに次に
列挙されています:
MySQL
4.x でも引き続き行われます。
InnoDB
tables -- Stable (3.23 では 3.23.49から)
InnoDB
storage engines は MySQL
3.23 ツリーでは version
3.23.49 から安定です。InnoDB
は大規模で負荷の大きい製品システムで
使用されています。
BDB
tables -- Gamma
Berkeley DB
はとても安定したコードですが、未だに BDB
トラン
ザクションstorage engines インターフェースに対し MySQL Server
で
は改良を加えている途中であり、他のテーブルタイプと同等に扱われるまでには
もう少し時間がかかりそうです。
FULLTEXT
-- Beta
MySQL
4.0 で行っています。
MyODBC 3.51
(uses ODBC SDK 3.51) -- Gamma
MyISAM
テーブルの自動復旧 -- Gamma
MyISAM
ストレージエンジンの新しいコードに対してだけです。
新しい MyISAM
ストレージエンジンは、テーブルをオープンするとき、
前にそのテーブルが正しくクローズされたか調べ、正しくクローズされていない
ときは自動的に検査と復旧を実行します。
MySQL
4.0 での MyISAM
テーブルへ大量のレコードを高速に挿入
する新しい機能です。
fcntl()
) を使用するため大きな問題があります。これら
の場合では、MySQL デーモンを --skip-external-locking
フラグつきで
動かすべきです。知られている問題は、いくつかの Linux システムと NFS マウ
ントされたファイルシステム使用時の SunOS です。
MySQL AB
は代金を支払った顧客のために 高サポートを提供しています。
しかし MySQL
メーリングリストは通常、全ての一般的な質問に回答を提
供しています。バグは通常すぐにパッチで修正され、深刻なバグには、ほとんど
いつも新しいリリースがあります。
MySQL
Version 3.22では、最大テーブルサイズに 4Gバイトという制限が
ありました。MySQL
Version 3.23から採用された新しい MyISAM
では、最大テーブルサイズは800万テラバイト( 2 ^ 63 バイト)に拡張されまし
た。
ただし、OSの側にも、ファイルサイズの制限が存在していることには注意して下 さい。いくつか例を示します:
オペレーティングシステム | ファイルサイズの制限 |
Linux-Intel 32 bit | 2Gバイト, 4Gバイト あるいはそれ以上, Linux のバージョンによる。 |
Linux-Alpha | 8Tバイト (?) |
Solaris 2.5.1 | 2Gバイト (パッチにより 4G に対応) |
Solaris 2.6 | 4Gバイト (フラグで変更可能) |
Solaris 2.7 Intel | 4Gバイト |
Solaris 2.7 UltraSPARC | 512Gバイト |
Linux 2.2 では、ext2ファイルシステム用のLFSパッチを適用することで、2G バ イト以上のテーブルを使用することができます。Linux 2.4ではReiserFS用の同 様のパッチが存在し、大きなファイルを扱うことができるようになります。(訳 注: Linux 2.4.1 以上では、最初から ReiserFS がカーネルのソースに組み込 まれていますし、2.4.16 以上では、ext3 もカーネルのソースに組み込まれまし た)
以上からわかるように、MySQL
の最大テーブルサイズはOSの制限によっ
て決まることがほとんどです。
デフォルトでは、MySQL
の最大テーブルサイズは4Gに設定されています。
あるテーブルの最大テーブルサイズは、SHOW TABLE STATUS
コマンドか、
myisamchk -dv table_name
によって確認することができます。
「4.5.6 SHOW
構文」節参照.
もしも4G 以上のテーブルが必要な場合には(加えて、OSがそれをサポートして
いる場合には)、テーブルを作る際に、AVG_ROW_LENGTH
と
MAX_ROWS
パラメータを設定することができます。 「6.5.3 CREATE TABLE
構文」節参照.
テーブル作成後に、ALTER TABLE
で変更することもできます。
「6.5.4 ALTER TABLE
構文」節参照
読み込み専用の大きなテーブルが必要なときは、myisampack
を使って複
数のテーブルを一つにまとめた上で圧縮することができます。myisampack
は、テーブルの大きさをだいたい50%程度まで圧縮できます。結果として、より
大きなテーブルを作ることが可能となるでしょう。 「4.7.4 myisampack
, MySQL の圧縮された読み込み専用テーブルジェネレータ」節参照.
MyISAM
データファイルに対する、OSのファイル制限を回避するのに、
RAID
オプションを使うこともできます。 「6.5.3 CREATE TABLE
構文」節参照.
MERGE
ライブラリ -- 同じ構造のテーブルをひとまとめに扱う機能を提
供します -- を使用するという解決法も考えられるでしょう。 「7.2 MERGE
Tables (3.23.25以上)」節参照.
MySQL Server
自身は 2000 年問題(Y2K)に対して何の問題も持っていま
せん:
MySQL Server
は UNIX 時間関数を使用し、2069
年まで日付には
何の問題もありません; 全ての2桁の年は 1970
から 2069
の範
囲にあると見なされます。これは、year
フィールド内に 01
を
格納する場合、MySQL Server
はそれを 2001
として扱うという
ことを意味します。
MySQL
日付関数は一つのファイル `sql/time.cc' に格納さ
れ、2000年安全であるようにとても注意深くコード化されています。
MySQL
3.22 以降のバージョンでは、新しい YEAR
フィールド型
は 0
と 1901
から 2155
までの年を1バイトで格納でき、
2桁または4桁で表示できます。
2000年安全でない方法で MySQL Server
を使用するアプリケーションで
は問題になります。例えば、多くの古いアプリケーションは4桁値ではなく2桁値
(これは曖昧です)を使用して年を格納し操作します。この問題は、00
ま
たは 99
のような値を ``欠けている'' 値の表われとして使用するアプ
リケーションによって作られます。
あいにく、これらの問題を修正するのは困難です。様々なアプリケーションが様々 なプログラマによって書かれていて、その各々が慣習と日付操作関数の様々な組 み合わせを使用するからです。
これは、MySQL Server
が 2030 年までの日付に何の問題もないことを示
す簡単なテストです:
mysql> DROP TABLE IF EXISTS y2k; Query OK, 0 rows affected (0.01 sec) mysql> CREATE TABLE y2k (date DATE, -> date_time DATETIME, -> time_stamp TIMESTAMP); Query OK, 0 rows affected (0.00 sec) mysql> INSERT INTO y2k VALUES -> ("1998-12-31","1998-12-31 23:59:59",19981231235959), -> ("1999-01-01","1999-01-01 00:00:00",19990101000000), -> ("1999-09-09","1999-09-09 23:59:59",19990909235959), -> ("2000-01-01","2000-01-01 00:00:00",20000101000000), -> ("2000-02-28","2000-02-28 00:00:00",20000228000000), -> ("2000-02-29","2000-02-29 00:00:00",20000229000000), -> ("2000-03-01","2000-03-01 00:00:00",20000301000000), -> ("2000-12-31","2000-12-31 23:59:59",20001231235959), -> ("2001-01-01","2001-01-01 00:00:00",20010101000000), -> ("2004-12-31","2004-12-31 23:59:59",20041231235959), -> ("2005-01-01","2005-01-01 00:00:00",20050101000000), -> ("2030-01-01","2030-01-01 00:00:00",20300101000000), -> ("2050-01-01","2050-01-01 00:00:00",20500101000000); Query OK, 13 rows affected (0.01 sec) Records: 13 Duplicates: 0 Warnings: 0 mysql> SELECT * FROM y2k; +------------+---------------------+----------------+ | date | date_time | time_stamp | +------------+---------------------+----------------+ | 1998-12-31 | 1998-12-31 23:59:59 | 19981231235959 | | 1999-01-01 | 1999-01-01 00:00:00 | 19990101000000 | | 1999-09-09 | 1999-09-09 23:59:59 | 19990909235959 | | 2000-01-01 | 2000-01-01 00:00:00 | 20000101000000 | | 2000-02-28 | 2000-02-28 00:00:00 | 20000228000000 | | 2000-02-29 | 2000-02-29 00:00:00 | 20000229000000 | | 2000-03-01 | 2000-03-01 00:00:00 | 20000301000000 | | 2000-12-31 | 2000-12-31 23:59:59 | 20001231235959 | | 2001-01-01 | 2001-01-01 00:00:00 | 20010101000000 | | 2004-12-31 | 2004-12-31 23:59:59 | 20041231235959 | | 2005-01-01 | 2005-01-01 00:00:00 | 20050101000000 | | 2030-01-01 | 2030-01-01 00:00:00 | 20300101000000 | | 2050-01-01 | 2050-01-01 00:00:00 | 00000000000000 | +------------+---------------------+----------------+ 13 rows in set (0.00 sec)
これは、DATE
と DATETIME
型は未来のいかなる日付において問
題のないことを示します (これら日付は 9999 年まで扱えます)
TIMESTAMP
型は、時刻を保存しますが、2030-01-01
までです。
TIMESTAMP
は 32-bit マシンで(signed value)は 1970
から
2030
の範囲です。64-bit マシンでは、 2106
年(unsigned
value)まで扱えれます。
MySQL Server
は 2000年対応ですが、曖昧でない入力を提供するのはあ
なたの責任です。曖昧な日付の入力データ(2桁の年の値)の扱いについての
MySQL Server
の規則については 「6.2.2.1 西暦2000年問題とデータ型」節 を参照してください。
MySQL AB
は、MySQL の創始者と主な開発者の会社です。
MySQL AB
は、最初は、David Axmark、Allan Larsson、Michael Monty
Wideniusらによってスウェーデンに設立されました。
MySQL
サーバの開発者は、この会社に雇われています。わたしたちは、
世界中の1ダースものの国々の人によるバーチャルな組織です。わたしたちは、
毎日、広くネットを使って、互いに連絡しあい、また、ユーザや支援者やパート
ナーと連絡しています。
私たちは、MySQL
の開発と私たちのデータベースを新しいユーザに広げるこ
とに専念しています。MySQL AB
はMySQL
サーバソースコードの著
作権, MySQL
logo の著作権, MySQL 商標権,このMySQL マニュアルの著
作権を所有します。 「1.2 MySQL とは何か」節参照.
MySQL
の核の価値は、わたしたちの MySQL
と Open Source
に対する献身を示しています。
私たちは MySQL Database Software
を次のようにしています。
MySQL AB と MySQL AB の人々は次を行います。
オープンソース
哲学を進展させ、オープンソース
コミュニティをサポートする
MySQL ウェブサイト(http://www.mysql.com/)は、MySQL と MySQL AB に ついての最新情報を提供しています。
私たちが最もよく受ける質問は:「どのようにして無料で配布して採算を 取っているのでしょうか?」というものです。それは、このようにしています。
MySQL AB
はサポート、サービス、商用ライセンス及びロイアリティで利
益をあげます。そして、私たちは製品開発とMySQL
の事業を展開するため、
これらの収益を利用します。
MySQL AB は創業以来、利益が増えています。2001年10月、私たちは有数のスカ ンジナビアの投資家および数少ないビジネスエンジェルからのベンチャー投資に 応じました。この投資は、私たちのビジネス・モデルを固め、持続的成長の基盤 を構築するために使用されます。
MySQL AB
は、MySQL
データ・ベースの設立者及び主な開発者に
より管理・運営されます。開発者は顧客及びその他のユーザの要望・課題を連絡
をとり続けるためのサポートを提供することを約束します。私たちの全てのサポー
トは有能な開発者によって提供されます。実際に複雑な質問は、MySQLサ
ーバー
の主要な著者である Michael Monty
Widenius が答えます。
「1.4.1 Support Offered by MySQL AB」節参照.
さらなる情報とサポートの依頼は、http://www.mysql.com/support/ か、 私たちの販売員 sales@mysql.com にご連絡ください。
MySQL AB
は MySQL
と関連したトレーニングを世界的に提供しま
す。私たちは、一般公募するコースと、あなたの会社のニーズに合せた特別な社内
研修の両方を提供します。MySQL トレーニング
はさらに、私たちのパート
ナーであるMySQL 認定 トレーニング・センター
でも受講ができます。
私たちのトレーニングの教材は、いくつかのデータベースの実例と資料・説明書、
そしてサンプルアプリケーションを使用します。また、教材は MySQL
の
最新バージョンを反映するために常時更新されます。私たちの講師は、トレーニン
グの質と教材の開発を保証するため、常に開発チームにサポートされます。これ
は、さらにトレーニング中の質問には必ず回答できることを保証します。
私たちのトレーニング講座に参加することにより、あなたの目標と MySQL
アプリケーションを実現することができるでしょう。さらに以下のことができる
でしょう:
MySQL 認定試験
の準備になります。
参加予定者あるいはトレーニング・パートナーとして私たちのトレーニングに興味 を持っている場合、http://www.mysql.com/training/のトレーニング課 にアクセスするか、あるいは training@mysql.com にメールで連絡を ください。
MySQL 認定プログラム
についての詳細な情報は
,http://www.mysql.com/certification/ を参照してください。
MySQL AB
と 認定パートナー
は、全世界の MySQLサーバ
のユーザとMySQLサーバ
を自身のソフトウェアに組み入れようとしている
ユーザにコンサルティングサービスを提供します。
わたしたちのコンサルタントは、データベースの設計と調整、効率のよい問合 せの作成、最適な性能のためのプラットホームの調整、移植の問題の解決、レ プリケーションの設定、頑強なトランザクションアプリケーションの作成とい つたことを助けます。
わたしたちは、お客様がご自身のアプリケーションにMySQL Server
を組
み込むことを手助けし、大規模なアプリケーションを作ることを手助けします。
私のコンサルタントは、あなたの開発チームと密接に協力して作業します。この
ことは、わたしたちの専門サービスの品質を確実にします。コンサルティングの
割り当ては、2日間の強力開始期間から、何週間も何ヶ月にもわたるプロジェク
トに広がります。わたしたちの専門意見は MySQLサーバ
だけを含むので
はなく、PHPやPerlやほかのスクリプティング言語とプログラミングにも広がっ
ています。
もし、わたしたちのコンサルティングサービスやコンサルティングパートナーに なることに興味をもったときは、私たちのコンサルティングセクションのWeb サ イト http://www.mysql.com/consulting/ を訪れるか、コンサルティン グスタッフ consulting@mysql.com に連絡してください。
MySQL
データベースは、GNU General Public License
(GPL
) のもとでリリースされています。これは、MySQL
ソフトウ
ェアは GPL
のもと、無償で使えることを意味します。 GPL
の条
件項目(あなたのアプリケーションもまた GPL
にしなければならない)に
束縛されたくないならば、MySQL AB
から同じ製品の商用ライセンスを購
入しなければなりません; http://www.mysql.com/products/pricing.html。
MySQL
ソースコードの著作権は MySQL AB
が所有するため、わた
したちは デュアルライセンス
を採用することができます。このことは、同
じ製品に GPL
と商用ライセンスの両方があるということです。これはど
うあろうと MySQL AB
のオープンソースの遂行には影響しません。商用
ライセンスが必要なときは、 「1.4.3 MySQL Licenses」節 を参照してください。
わたしたちは、MySQLサーバ
に機能を追加するサードパーティーの
オープンソースGPL
ソフトウェアの商用ライセンスも販売しています。
よい例は、InnoDB
トランザクション対応ストレージエンジンです。この
エンジンは、ACIDが使え、低水準のロック、破壊からの回復、マルチバージョニ
ング、外部キーが使えるといった特徴があります。 詳しくは 「7.5 InnoDB
テーブル (3.23.6以上)」節参照 を
参照してください。
MySQL AB
は、トレーニングコース、コンサルティングとサポート、出版、
MySQL
関連製品の再販と販売に関する、全世界のパートナープログラム
をもっています。 MySQL AB
パートナーは、webサイト
http://www.mysql.com/で公開され、製品を識別しビジネスを推進するた
めの MySQL
のトレードマークの特別バージョンを使う権利が得られます。
もし、MySQL AB パートナー
になることに興味をおもちならば、
partner@mysql.com に 電子メールを送ってください。
MySQL
の単語と MySQL
のイルカのロゴは、MySQL AB
のトレードマークです。
「1.4.4 MySQL AB Logos and Trademarks」節参照。
このトレードマークは、 MySQL
の創設者が何年にもわたって築いてきた
重要な価値の象徴です。
MySQL
のwebサイト (http://www.mysql.com/)は、開発者とユー
ザの間では人気があります。2001年10月で、1千万ページビューがありました。
訪問者は、購入の決定者とソフトウェアとハードウェアの両方の推奨者のグルー
プです。訪問者の12%は購入の決定を承認し、たった9%が購入決定に関わってい
ませんでした。65%以上が、半年の間に何らかのオンラインビジネスの購入をし
ていて、70%が数ヶ月の間に購入を計画していました。
MySQL
のwebサイト(http://www.mysql.com/)にはMySQL
と MySQL AB
の最新の情報があります。
報道サービスやわたしたちのニュースリリース (http://www.mysql.com/news/)に書かれていない質問は、 press@mysql.com に電子メールを送ってください。
MySQL AB
との間に有効なサポート契約があるならば、あなたは、
MySQL
ソフトウェアの技術的な質問に対する正確な答えがタイムリーに
得られます。より詳しい情報は、 「1.4.1 Support Offered by MySQL AB」節.私たちのwebサイト、
http://www.mysql.com/support/ を見るか、sales@mysql.com
にメールを送ってください。
MySQL
トレーニングについての情報は、
http://www.mysql.com/training/ のトレーニング節を訪れてください。
インターネットにアクセスできないときは、training@mysql.com の
MySQL AB
トレーニングスタッフに連絡してください。 「1.3.1.2 トレーニングと認定」節参照。
MySQL 認定プログラム
に関する情報は、
http://www.mysql.com/certification/を見てください。 「1.3.1.2 トレーニングと認定」節参照。
コンサルティングに興味があるならば、
http://www.mysql.com/consulting/ のコンサルティング部門を見てくだ
さい。インターネットにアクセスできないときは、
consulting@mysql.com の MySQL AB
コンサルティングスタッ
フに連絡してください。 「1.3.1.3 コンサルティング」節参照.
商用ライセンスは、https://order.mysql.com/ でオンラインで購入でき
ます。MySQL AB
にどうやって購入のFAXを送るかの情報もあります。よ
り詳しい情報はhttp://www.mysql.com/products/pricing.html にありま
す。もし、ライセンスに関する質問があったり、大量のライセンスの見積もりが
必要なときは、webサイト(http://www.mysql.com/)の連絡用紙に記入す
るか、licensing@mysql.com (ライセンスの質問用)に電子メールを送
るか、sales@mysql.com (セールスの見積もり用) に電子メールを送っ
てください。 「1.4.3 MySQL Licenses」節参照.
ビジネスで MySQL AB
のパートナーに興味があるときは、
partner@mysql.com に電子メールを送ってください。 「1.3.1.5 パートナー」節参照.
MySQL
のトレードマークの考え方は、
hhttp://www.mysql.com/company/trademark.htmlを見るか、
trademark@mysql.com に電子メールを送ってください。 「1.4.4 MySQL AB Logos and Trademarks」節参照.
もし、MySQL AB
のジョブ選択
(http://www.mysql.com/company/jobs/)にある仕事に興味があるならば、
jobs@mysql.com に電子メールを送ってください。あなたのCV(履歴書)
は添付しないで、プレーンテキストであなたの電子ールの最後につけてください。
多くのユーザの間の一般的な議論は、適切なメーリングリストに注意してくだい。 「1.6.1 MySQL メーリングリスト」節参照.
エラー(多くの場合はバグと呼ばれます)の報告、同じように質問やコメントは、
mysql@lists.mysql.com のメーリングリストに送ってください。
MySQLサーバ
に要注意のセキュリティホールが見つかったときは、
security@mysql.com に電子メールを出してください。 「1.6.1.3 バグや問題を報告する方法」節参照.
公開してよいベンチマークの結果があるときは、benchmarks@mysql.com に連絡してください。
このマニュアルに対する追加や修正は、docs@mysql.com のマニュアル チームに連絡してください。
MySQL
のwebサイト(http://www.mysql.com/)に対する作業や内容
のコメントや質問は、webmaster@mysql.com に電子メールを出してく
ださい。
MySQL AB
にはプライバシーポリシーがあります。それは、
http://www.mysql.com/company/privacy.html で読めます。このポリシ
ーに関して質問があれば privacy@mysql.com に電子メールを送ってく
ださい。
その他の質問は、info@mysql.com に電子メールを送ってください。
(訳注: ライセンスの章については、正確さをきすため原文を併記しています。 訳文だけでなく原文に目を通してください。もし意味の取違いを見つけたなら、 takeshi@SoftAgency.co.jp に連絡してください。)
このセクションでは、MySQL
のサポートとライセンス規定について説明します。
Technical support from MySQL AB
means individualised answers
to your unique problems direct from the software engineers who code
the MySQL
database engine.
We try to take a broad and inclusive view of technical support. Almost
any problem involving MySQL
software is important to us if it's
important to you.
Typically customers seek help on how to get different commands and
utilities to work, remove performance bottlenecks, restore crashed
systems, understand operating system or networking impacts on MySQL
,
set up best practices for backup and recovery, utilise API
s, etc.
Our support covers only the MySQL
server and our own utilities,
not third-party products that access the MySQL
server, though we
try to help with these where we can.
Detailed information about our various support options is given at http://www.mysql.com/support/, where support contracts can also be ordered online. If you have restricted access to the Internet, contact our sales staff at sales@mysql.com.
Technical support is like life insurance. You can live happily
without it for years, but when your hour arrives it becomes
critically important, yet it's too late to buy it!
If you use MySQL
Server for important applications and encounter
sudden troubles, it might take too long to figure out all the answers
yourself. You may need immediate access to the most experienced
MySQL
troubleshooters available, those employed by MySQL AB
.
MySQL AB
owns the copyright to the MySQL
source code,
the MySQL
logos and trademarks and this manual.
「1.3 MySQL AB とは何か」節参照.
Several different licenses are relevant to the MySQL
distribution:
MySQL
-specific source in the server, the mysqlclient
library and the client, as well as the GNU
readline
library
is covered by the GNU General Public License
.
「H GNU General Public License」節参照.
The text of this license can also be found as the file `COPYING'
in the distributions.
GNU
getopt
library is covered by the
GNU Lesser General Public License
.
「I GNU Lesser General Public License」節参照.
regexp
library) are covered
by a Berkeley-style copyright.
MySQL
(3.22 and earlier) are subject to a
more strict license
(http://www.mysql.com/products/mypl.html).
See the documentation of the specific version for information.
GPL
-style license.
Use of the manual is subject to the following terms:
MySQL AB
is required.
For information about how the MySQL
licenses work in practice,
please refer to 「1.4.3 MySQL Licenses」節.
Also see 「1.4.4 MySQL AB Logos and Trademarks」節.
The MySQL
software is released under the
GNU General Public License
(GPL
),
which probably is the best known Open Source
license.
The formal terms of the GPL
license can be found at
http://www.gnu.org/licenses/.
See also http://www.gnu.org/licenses/gpl-faq.html and
http://www.gnu.org/philosophy/enforcing-gpl.html.
Since the MySQL
software is released under the GPL
,
it may often be used for free, but for certain uses you may want
or need to buy commercial licenses from MySQL AB
at
https://order.mysql.com/.
See http://www.mysql.com/products/licensing.html for
more information.
Older versions of MySQL
(3.22 and earlier) are subject to a
more strict license
(http://www.mysql.com/products/mypl.html).
See the documentation of the specific version for information.
古いバージョンの MySQL
(3.22 とそれ以前) は
より制限されたライセンスを有していることに気をつけて下さい
(http://www.mysql.com/support/arrangements/mypl.html)。
より詳しくは、それぞれのバージョンに添付のドキュメントを御覧下さい。
Please note that the use of the MySQL
software under commercial
license, GPL
, or the old MySQL
license does not
automatically give you the right to use MySQL AB
trademarks.
「1.4.4 MySQL AB Logos and Trademarks」節参照.
The GPL
license is contagious in the sense that when a program
is linked to a GPL
program all the source code for all the parts
of the resulting product must also be released under the GPL
.
Otherwise you break the license terms and forfeit your right to use the
GPL
program altogether and also risk damages.
You need a commercial license:
GPL
code from the MySQL
software and don't want the resulting product to be GPL
, maybe
because you want to build a commercial product or keep the added
non-GPL
code closed source for other reasons. When purchasing
commercial licenses, you are not using the MySQL
software under
GPL
even though it's the same code.
GPL
application that only works with the
MySQL
software and ship it with the MySQL
software. This type
of solution is actually considered to be linking even if it's done over
a network.
MySQL
software without providing
the source code as required under the GPL
license.
MySQL
database even if you don't formally need a commercial license.
Purchasing support directly from MySQL AB
is another good way
of contributing to the development of the MySQL
software, with
immediate advantages for you.
「1.4.1 Support Offered by MySQL AB」節参照.
If you require a license, you will need one for each installation of the
MySQL
software. This covers any number of CPUs on a machine, and there
is no artificial limit on the number of clients that connect to the server
in any way.
For commercial licenses, please visit our website at http://www.mysql.com/products/licensing.html. For support contracts, see http://www.mysql.com/support/. If you have special needs or you have restricted access to the Internet, please contact our sales staff at sales@mysql.com.
You can use the MySQL
software for free under the GPL
if
you adhere to the conditions of the GPL
.
For more complete coverage of the common questions about the GPL
see the generic FAQ from the Free Software Foundation at
http://www.gnu.org/licenses/gpl-faq.html.
Some common cases:
MySQL
source code under the GPL
with your product.
MySQL
source code bundled with other
programs that are not linked to or dependent on the MySQL
system
for their functionality even if you sell the distribution commercially.
This is called mere aggregation in the GPL
license.
MySQL
system, you can use it for free.
MySQL
servers for your customers.
However, we do encourage people to use ISPs that have MySQL support,
as this will give them the confidence that if they have some problem
with the MySQL
installation, their ISP will in fact have the
resources to solve the problem for them.
Note that even if an ISP does not have a commercial license for
MySQL Server
, they should at least give their customers read
access to the source of the MySQL
installation so that the
customers can verify that it is patched correctly.
MySQL
Database Software in conjunction with a
web server, you do not need a commercial license (so long as it is not
a product you distribute). This is true even if you run a commercial
web server that uses MySQL Server
, because you are not
distributing any part of the MySQL
system. However, in this
case we would like you to purchase MySQL
support because the
MySQL
software is helping your enterprise.
If your use of MySQL
database software does not require a commercial
license, we encourage you to purchase support from MySQL AB
anyway.
This way you contribute toward MySQL
development and also gain
immediate advantages for yourself. 「1.4.1 Support Offered by MySQL AB」節参照.
If you use the MySQL
database software in a commercial context
such that you profit by its use, we ask that you further the development
of the MySQL
software by purchasing some level of support. We feel
that if the MySQL
database helps your business, it is reasonable to
ask that you help MySQL AB
.
(Otherwise, if you ask us support questions, you are not only using
for free something into which we've put a lot a work, you're asking
us to provide free support, too.)
Many users of the MySQL
database want to display the
MySQL AB
dolphin logo on their web sites, books, or
boxed products. We welcome and encourage this, although it should be
noted that the word MySQL
and the MySQL
dolphin logo
are trademarks of MySQL AB
and may only be used as stated in
our trademark policy at
http://www.mysql.com/company/trademark.html.
The MySQL
dolphin logo was designed by the Finnish advertising
agency Priority in 2001. The dolphin was chosen as a suitable symbol
for the MySQL
database since it is a smart, fast, and lean animal,
effortlessly navigating oceans of data. We also happen to like dolphins.
The original MySQL
logo may only be used by representatives of
MySQL AB
and by those having a written agreement allowing them
to do so.
We have designed a set of special Conditional Use logos that may be
downloaded from our web site at
http://www.mysql.com/press/logos.html
and used on third-party web sites without written permission from
MySQL AB
.
The use of these logos is not entirely unrestricted but, as the name
implies, subject to our trademark policy that is also available on our
web site. You should read through the trademark policy if you plan to
use them. The requirements are basically:
MySQL AB
, are the creator and
owner of the site that displays the MySQL
trademark.
MySQL AB
or to the value of MySQL AB
trademarks. We reserve the right to
revoke the right to use the MySQL AB
trademark.
MySQL
database under GPL
in an
application, your application must be Open Source
and
be able to connect to a MySQL
server.
Contact us at trademark@mysql.com to inquire about special arrangements to fit your needs.
In the following cases you need a written permission from MySQL AB
before using MySQL
logos:
MySQL AB
logo anywhere except on your web site.
MySQL AB
logo except the Conditional Use
logos mentioned previously on web sites or elsewhere.
Out of legal and commercial reasons we have to monitor the use of MySQL
trademarks on products, books, etc. We will usually require a fee for
displaying MySQL AB
logos on commercial products, since we think
it is reasonable that some of the revenue is returned to fund further
development of the MySQL
database.
MySQL
partnership logos may only be used by companies and persons
having a written partnership agreement with MySQL AB
. Partnerships
include certification as a MySQL
trainer or consultant.
Please see 「1.3.1.5 パートナー」節.
MySQL
in Printed Text or Presentations
MySQL AB
welcomes references to the MySQL
database, but
note that the word MySQL
is a trademark of MySQL AB
.
Because of this, you should append the trademark symbol (TM
) to
the first or most prominent use of the word MySQL
in a text and
where appropriate, state that MySQL
is a trademark of
MySQL AB
. Please refer to our trademark policy at
http://www.mysql.com/company/trademark.html for details.
MySQL
in Company and Product Names
Use of the word MySQL
in product or company names or in Internet
domain names is not allowed without written permission from MySQL AB
.
MySQL AB
が長い間約束してきて、ユーザからは長い間待ち続けられてき
た、MySQLサーバ4.0が、http://www.mysql.com/からダウンロードできる
ベータとして使えるようになりました。
MySQLサーバ4.0の主要な新しい機能は、わたしたちのこれまでのビジネスとユー ザに前進のギアを入れ、ミッションクリティカルで、高負荷に耐えるデータベー スシステムとしてMySQLデータベースを拡張しています。
MySQLは 4.0.6 からガンマ(gamma)とラベルづけられ、4.0.x は2ヶ月以上(最初の1月は アルファで、そしてベータ)、修正が困難な重要な問題も見つからないで使われていて、 実運用に使えます。
少なくとも1ヶ月間重要なバグがなければ、MySQL 4.0 からガンマの接頭辞を取り 除きます。
MySQLソフトウェアの新しい機能は、bk ソースツリーから利用できるMySQL 4.1 で追加され、2003年の最初の四半期にアルファリリースしようとされています。
すべてのバイナリリリースは、検査したすべてのプラットフォームで、エラーな しで、私たちの広範囲のテストスイートに合格しています。MySQL 4.0は多くのユ ーザで検査され、いくつかの大きなサイトで運用に入っています。
libmysqld
でMySQL Serverは広範なアプリケーションにふさわしくなります。
組み込み MySQL サーバライブラリを使用することで、MySQL を色々なアプリケ
ーション、電子機器(それらにデータベースが利用されていることなどはエンド
ユーザが気にすることはない)に埋め込めます。組み込み MySQL は、
インターネットのアプリケーションや、キオスク、ハードウェア、ソフトウェア
を組み合わせたもの、高パフォーマンスのインターネットサーバ、CD-ROMに全てが
収まっているデータベース、などの裏方での利用に最適です。
多くのlibmysqld
ユーザは、MySQLのデュアルライセンスの恩恵をうけ
ます。GPLに束縛されたくないユーザは、商用ライセンスでソフトウェアを使え
るようになります。組み込みMySQLライブラリは通常のクライアントライブラリ
と同じインタフェースを使っているので、便利で使いやすくなっています。
「8.4.9 libmysqld, the Embedded MySQL Server Library」節参照.
INSERT
や、圧縮されたインデクスの検索、
FULLTEXT
インデクスの作成と、COUNT(DISTINCT)
です。
InnoDB
ストレージエンジンが、MySQLサーバの標準の機能として、今回、
提示されました。これは、完全なトランザクション
のサポートと
レコードレベルのロック
が含んでいます。
latin1_de
が
使え、ドイツ語のソート順では、ドイツ語のウムラルトをドイツの電話
帳と同じ順にします。
TRUNCATE TABLE
と、(Sybaseにある)自動的にキーを増や
すIDENTITY
がシノニムとして入りました。多くのユーザは、MySQLサーバ
では長い間待たされてきた、標準SQLの機能であるUNION
文が使えるよう
になったことがわかり、うれしく思うでしょう。
DELETE
文と
UPDATE
文が加わりました。テーブルの水準に(前のようにデータベースの
水準でなく)MyISAM
にシンボリックリンク
が使えるようになり、
Windowsではデフォルトでシンボリックリンクが使えるようになりました。これ
で、わたしたちが拡張の要求を真剣に扱っていることがわかると願います。
SQL_CALC_FOUND_ROWS
とFOUND_ROWS()
機能が新しく追加されまし
た。これは、句なしで返すために、LIMIT
句を含むSELECT問合せで、行の数
を返します。
つぎのMySQL Server 4.x リリースでは開発中の次の項目を予定しています。
フェールセーフなレプリケー
ション
が入るでしょう;4.0ですでにある、LOAD DATA FROM MASTER
コマ
ンドは、すぐにスレーブの設定を自動化するようになります。オンライン
バックアップ
は、マスターを停止しないで新しいレプリケーションスレーブを
追加することを簡単にし、更新が多いシステムでは性能劣化がとても少なくなっ
ています。
mysql
のパラメータ
(起動オプション)がサーバを停止しなくても設定できるようになることです。
FULLTEXT
検索の属性で、バイナリと自然言
語の検索ロジックで、大きなテキストの固まりにFULLTEXT
索引が作れる
ようになりました。最小ワード長を変更でき、また、どのような自然言語に対し
てもストップワードを定義でき、これにより新しい種類のアプリケーションを
MySQLサーバに作成できます。
キーキャッシュ
を書き直すことで、問合せを繰り返すア
プリケーションをさらに高速にできるようになりました。
MySQL コマンドヘルプ
をみて、うれしく思う
でしょう。
MySQL Server 4.0 は、MySQL Server 4.1 の新しい機能の基礎となります。その
機能は、入れ子になった副問合せ
(4.1)、ストアードプロシージャ
(5.0)、MyISAM表の外部キーの一貫性のルール
(5.0)で、多くのお客様か
らのご要望の一覧のうちで上位となるものです
これらの追加の後に、MySQLデータベースサーバの評論家は、MySQLデータベース 管理システムの欠点を指摘するよりも、より構想力が必要となるでしょう。すでに、長い 間知られている安定性、速度、使いやすさで、MySQLサーバは、切望して いる購入者の要求項目の一覧に適合するでしょう。
この節では、MySQLメーリングリストを紹介し、どのように使うかのガイドライ ンを記述します。メーリングリストを購読すると、電子メールのメッセージで、 リストへ送られたすべてを受け取ります。あなたはリストに質問や回答を送るこ とができます。
メイン MySQL メーリングリストを購読するには、メッセージを電子メールアド レス mysql-subscribe@lists.mysql.com に送ってください。
メイン MySQL メーリングリストの購読の中止は、メッセージを電子メールアド レス mysql-unsubscribe@lists.mysql.com に送ってください。
メールの購読と購読の中止には、メッセージを送る先のアドレスだけが重要です。 メッセージのサブジェクトと本文は無視されます。
もし、あなたのリプライアドレスがつかえないときは、アドレスを明示的に指定
できます。subscribe あるいは unsubscribe のあとにハイフンを付け、そのあ
とにあなたのアドレスを記述します。ただし `@' 文字は `=' に置
き換えて書きます。例えば、 your_name@host.domain
で購読したい場
合は、mysql-subscribe-your_name=host.domain@lists.mysql.com
宛に
メッセージを送ります。
mysql-subscribe@lists.mysql.com や mysql-unsubscribe@lists.mysql.com へのメールは ezmlm メーリングリストプロセッサによって自動的に処理されます。 ezmlm についての情報は ezml ウェブサイトを参考してください (http://www.ezmlm.org/)
本メーリングリストへ投稿するには、mysql@lists.mysql.com
にメッセージを送ります。
しかし、subscribe あるいは unsubscribe のメールを
mysql@lists.mysql.com に送らないでください。
これらのアドレスへ送られたメールは、何千ものユーザに配送されてしまいます。
あなたのローカルサイトが多くの mysql@lists.mysql.com の購読者を持て
ます。この場合、ローカルのメーリングリストを作り、lists.mysql.com
からの
一つのメッセージがそのサイトに送られ、ローカルなリストで複写されるように
してください。この場合、ローカルの MySQL リストへの追加と削除は、
あなたのシステム管理者に問い合わせて下さい。
あなたのメーラーでMySQL メーリングリストからのメールを
適切なメールボックスへ振り分けるには、
(振り分け用の)フィルタをメッセージヘッダを頼りに動作するよう設定して下さい。
その場合、List-ID:
ヘッダか Delivered-To:
ヘッダが
識別の役に立つことでしょう。
次の MySQL メーリングリストがあります:
announce-subscribe@lists.mysql.com announce
mysql-subscribe@lists.mysql.com mysql
mysql-digest-subscribe@lists.mysql.com mysql-digest
mysql
リストです。
このリストからは、一日分の全てのメッセージががまとめられた(ダイジェスト)形式で送られてきます。
bugs-subscribe@lists.mysql.com bugs
mysqlbug
を使
用して投稿すべきです(Windows 上で実行している場合は、OS と
MySQL バージョンの記述を含めるべきです)。
できれば投稿前にMySQL の最新の安定バージョンか開発バージョンを使用して
問題をテストしてください。
含められたテストケース上で、mysql test < script
を使
用することで、誰もがバグを再現できるようにすべきです。このリストに投稿された全て
のバグは、次の MySQL リリースで修正されるかドキュメント化されま
す。小さなコードの変更だけですめば、私たちはこの問題を修正するパッチを投
稿します。
bugs-digest-subscribe@lists.mysql.com bugs-digest
bugs
リストです。
internals-subscribe@lists.mysql.com internals
internals-digest-subscribe@lists.mysql.com internals-digest
internals
リストのダイジェスト版です。
java-subscribe@lists.mysql.com java
java-digest-subscribe@lists.mysql.com java-digest
java
リストのダイジェスト版です。
win32-subscribe@lists.mysql.com win32
win32-digest-subscribe@lists.mysql.com win32-digest
win32
リストのダイジェスト版です。
myodbc-subscribe@lists.mysql.com myodbc
myodbc-digest-subscribe@lists.mysql.com myodbc-digest
myodbc
リストのダイジェスト版です。
mysqlcc-subscribe@lists.mysql.com mysqlcc
MySQL Control Center
graphical client 全般についてのリストです。
mysqlcc-digest-subscribe@lists.mysql.com mysqlcc-digest
mysqlcc
リストのダイジェスト版です。
plusplus-subscribe@lists.mysql.com plusplus
plusplus-digest-subscribe@lists.mysql.com plusplus-digest
plusplus
リストのダイジェスト版です。
msql-mysql-modules-subscribe@lists.mysql.com msql-mysql-modules
msql-mysql-modules-digest-subscribe@lists.mysql.com msql-mysql-modules-digest
msql-mysql-modules
リストのダイジェスト版です。
上述したのと同じ方法で全てのリストの購読または購読中止ができます。あなた
の購読または購読中止のメッセージは、mysql
ではなく適切なメーリングリス
トに送ってください。例えば、myodbc
リストを購読または購読中止するには、
myodbc-subscribe@lists.mysql.com または
myodbc-unsubscribe@lists.mysql.com にメールを送ります。
メーリングリストから有益な回答が得られない場合、MySQL ABに 有料のサポートを求めることもできます。有料サポートが必要な場合、 MySQL 開発チームに直接御連絡下さい( 「1.4.1 Support Offered by MySQL AB」節参照)。
次の表は英語以外の MySQL メーリングリストを示します。注意: これら は MySQL AB によって運用されていません。そのため、私たちはそれらの 品質を保証できません。
mysql-france-subscribe@yahoogroups.com フランス語メーリングリスト
list@tinc.net 韓国語メーリングリスト
subscribe mysql your@e-mail.address
をメールしてください。
mysql-de-request@lists.4t2.com ドイツ語メーリングリスト
subscribe mysql-de your@e-mail.address
をメールしてください。
これについては http://www.4t2.com/mysql で情報を見つけられます。
mysql-br-request@listas.linkway.com.br ポルトガル語メーリングリスト
subscribe mysql-br your@e-mail.address
をメールしてください。
mysql-alta@elistas.net スペイン語メーリングリスト
subscribe mysql your@e-mail.address
をメールしてください。
メーリングリストへ質問を尋ねる前に、以下の手順を踏んでください:
ここで回答が見つけられない場合は、近くの MySQL 熟練者ととも に調べて下さい。まだあなたの質問の回答が見つけられなければ、先に進み、次 のセクションの mysql@lists.mysql.com へメールを送る方法についてを読んで ください。
良いバグレポートを書くのには忍耐が要りますが、それを最初に正しく行うと 私たちとあなたの時間を節約します。 バグについての完全なテストケースを含む良いレポートを書くと、次のリリー スでそのバグが修正される可能性がとても高くなります。 この節では、かなりの、または全く私たち の助けにならないことにあなたの時間を浪費しないように、あなたがレポートを 正しく書くことを手助けします。
私たちは、バグレポートまた可能ならば全ての問題についてのレポートの作成に
mysqlbug
スクリプトを使用することを奨励します。mysqlbug
は
ソース配布内の `scripts' ディレクトリ、または、バイナリ配布では
MySQL をインストールしたディレクトリ配下の `bin' ディレク
トリにあります。mysqlbug
を使用できない場合は、この節に挙
げられている全ての必要な情報を含めてください。
mysqlbug
スクリプトは、下記の多くの情報を自動的に見つけ出すことで、
レポートの作成を手助けします。しかし、重要な何かが足りない場合、あなたの
メッセージにそれを含めてください。この節を慎重に読んで、ここで述べられ
ている全ての情報がレポート中に含まれていることを確認してください。
バグや問題を報告する通常の場所は、mysql@lists.mysql.com です。
バグを明確に示すテストケースを作ることができれば、
bugs@list.mysql.com リストにそれを投稿してください。注意: この
リストには、完全で再現可能なバグ情報を mysqlbug
スクリプトを使用
して投稿すべきです。 Windows 上で実行している場合は、OS と
MySQL バージョンの記述を含めてください。できれば、投稿前に
MySQL Server の最新の安定バージョンか開発バージョンを使用して問題をテ
ストしてください。含められたテストケース上で、``mysql test < script
'' を使
用することで、または、バグレポートに含められたシェル/Perlスクリプトを実
行することで、誰もがバグを再現できるようにすべきです。この bugs
リストに投稿された全て
のバグは、次の MySQL リリースで修正されるかドキュメント化されま
す。 小さなコードの変更だけですめば、私たちはこの問題を修正するパッチの投
稿も行います。
多すぎる情報を含むメッセージに答えることはできますが、少なすぎる情報を含 むものにはできないということを覚えていてください。しばしば人は事実を省い てしまいます。問題の原因をわかっていると思い、いくつかの細かいことを重大でない と見なしてしまうからです。良い原則は: 何かを言おうか迷ったときには、言っ てください。最初にあなたが十分な情報を含めなかったために、再び質問して 回答を待つことを強いられるより、数行をあなたのレポートに書く方が千倍速く て、迷惑ではありません。
良くある間違いは、使用している MySQL 配布のバージョン番号を示さ ない、または MySQL server をインストールしたプラットフォームを(プラッ トフォームのバージョン番号を含めて)示さないことです。これはとても関連した 情報で、100 のバグレポートのうち 99 の場合、この情報がないと役に立ちませ ん。私たちは ``何故私では動作しないの?'' のような質問をとても良く受けま す。そして私たちは、要求された機能はその MySQL バージョンに実装さ れていない、または、レポート中に述べられているバグは新しい MySQL バージョンで既に修正されているであることを見つけます。ときどき、 エラーはプラットフォーム依存で、オペレーティングシステムとプラットフォー ムのバージョン番号を知らないことには、何も修正することはできません。
問題に関連している場合は、コンパイラについての情報も与えることを忘れない でください。しばしば人はコンパイラのバグを見つけて、問題は MySQL に関連していると考えます。多くのコンパイラはいつも開発中 で、バージョンを上げることによってより良いバージョンになります。問題がコ ンパイラに依存しているかどうかを確定するには、どのコンパイラが使用されて いるかを知ることが必要です。全てのコンパイルの問題はバグレポートとみなさ れ、それに従って報告されるべきであることに注意してください。
最も役に立つのは、問題の良い説明がバグレポートに含められることです。つま り、問題に導かれる全ての行ったことの例と、正確に記述された問題それ自身 です。良いバグレポートは、バグや問題を再現する方法を示す完全な例を含むも のです。 「E.1.6 Making a Test Case When You Experience Table Corruption」節参照.
問題がエラーメッセージを与える場合、それをレポートに含めることはとても重 要です。私たちがプログラムを使用するアーカイブから何かを検索しようとする 場合、エラーメッセージはプログラムが与えたものと正確に一致する方が良いで す(大文字小文字でさえも残されるべきです)。どのようなエラーメッセージだったか を覚えるなんてことはしてはいけません;レポートに完全なメッセージをコピー して貼りつけてください。
MyODBC での問題がある場合、MyODBC トレースファイルの生成を試みるべきです。 「8.3.7 Reporting Problems with MyODBC」節参照.
あなたのレポートを読む多くの人が 80桁ディスプレイを使用しているというこ
とを覚えておいて下さい。mysql
コマンドラインツールを使用
してレポートまたはサンプルを生成するとき、そのようなディスプレイの有効幅を
超える出力(例えば、EXPLAIN SELECT
文; 後述のサンプル
を見てください)には、--vertical
オプション(または \G
ステー
トメント終端)を使用してください。
mysqladmin version
の
実行でわかります。mysqladmin
は MySQL のインストール
ディレクトリ配下の `bin' ディレクトリにあります。
uname -a
の実行によってこの情報が得られます。
mysqld
が死んだ場合は、mysqld
がクラッシュしたクエリも
レポートしてください。通常、これはロギングが有効にして mysqld
を実行すること
よって、見つけられます。 「E.1.5 Using Log Files to Find Cause of Errors in mysqld」節参照。
mysqldump --no-data db_name tbl_name1 tbl_name2 ...
からの出力を含めて
ください。これはデータベース内の任意のテーブルについての情報を得るとても
簡単で強力な方法で、私たちがあなたの状況に一致するものを生成する手助けにな
ります。
SELECT
文での速度に関するバグや問題では、
EXPLAIN SELECT ...
の出力と、少なくとも SELECT
文が
返す行の数を常に含めるべきです。誰かがあなたを助けられるように、
あなたの状況について、より多くの
情報を、より適切に与えてください。例え
ば、次はとても良いバグレポートの例です(もちろん mysqlbug
スクリプトで投
稿されてます):
mysql
コマンド行ツール配下での実行例(注意: 出力幅がディスプレイ装
置の80桁を超える文には、\G
文終端子を使用し
てください):
mysql> SHOW VARIABLES; mysql> SHOW COLUMNS FROM ...\G <SHOW COLUMNS からの出力> mysql> EXPLAIN SELECT ...\G <EXPLAIN からの出力> mysql> FLUSH STATUS; mysql> SELECT ...; <問い合わせを実行した時間を含んだSELECTの出力の短い版> mysql> SHOW STATUS; <SHOW STATUS からの出力>
mysqladmin variables extended-status processlist
の
出力結果をメールに含めてください。これはあなたのシステムの情報を
提供します。
mysqldump
を使用し
てあなたのテーブルをダンプし、あなたの問題を説明した `README' ファ
イルを作ってください。
tar
と gzip
または zip
を使用して、ファイルの圧縮アー
カイブを生成し、そのアーカイブを ftp
を使用して
ftp://support.mysql.com/pub/mysql/secret/ に転送してください。それか
ら問題の短い説明を mysql@lists.mysql.com に送ってください。
ftp
を使用して ftp://support.mysql.com/pub/mysql/secret/ にデー
タを転送することができます。データが本当に最高機密で私たちにさえ見せたくな
い場合は、先に進んで、他の変数名等を使用してサンプルを作ってみてください。
しかしこれは最後の選択と思ってください。
mysqld
デーモン開始時に使用したオプションと
MySQL クライアントプログラムの実行に使用したオプションを示してく
ださい。 mysqld
, mysql
または configure
スクリプト
へのオプションはしばしば回答への鍵になり、とても関連しています。とに
かくそれらを含めるというのは悪い考えではありません。Perl や PHP などの
モジュールを使用している場合、それらのバージョン番号も含めてください。
mysqlaccess
の出力、
mysqladmin reload
の出力、接続しようとしたときに得られた全てのエラー
メッセージを含めてください。権限をテストするときは、まず mysqlaccess
を実行してください。その後、mysqladmin reload version
を実行し、最
後に問題が発生するプログラムでの接続を試みてください。mysqlaccess
はMySQL インストールディレクトリ配下の `bin' ディレクトリ
にあります。
parse error
が発生する場合、構文を厳密にチェックしてください。何
も間違いが見つけられなければ、多分、使用しているクエリを
MySQL Server の現在のバージョンがサポートしていないということです。現
在のバージョンを使用していて、http://www.mysql.com/documentation/manual.php のマ
ニュアルがあなたの使用しているクエリ構文を扱えない場合は、これは
MySQL Server があなたのクエリをサポートしていないという意味です。この
場合、あなたの選択肢は、その構文をあなた自身で実装するか、
mysql-support@mysql.com に email で実装するように申し込むか
です。
マニュアルではあなたの使用している構文が使えるのに対してMySQL
の古いバージョンを使用している場合、文法が実装された時期について
MySQL Server の変更履歴を調べてください。 「D MySQL Change History」節参照。この場合、よ
り新しいバージョンの MySQL へのアップグレードを選択できます。
myisamchk
か
CHECK TABLE
/REPAIR TABLE
文で検査し、修復を試みるべきです
「4 データベース管理」節参照.
mysqld
は更新の最中に kill されない限りは
テーブルを絶対に破壊しません。もしなぜ mysqld
が死ぬのか
見つけた場合は、私たちがあなたに問題解決のための修正を提供することが、
はるかに簡単になります。
「A.1 How to Determine What Is Causing Problems」節参照
もしあなたがサポート顧客なら、より高い優先度で取り扱われるように、バグレポー トを mysql-support@mysql.com と、そして同様に、他の誰かが問題を経 験済み(そして、もしかしたら解決済み)かどうかを調べるために、適切なメーリン グリストにもクロスポストしてください。
MyODBC のバグ報告上の情報については、 「8.3.4 MyODBC での問題をどのように報告すべきか?」節 を参照 してください。
いくつかの一般的な問題の解決法のために 「A Problems and Common Errors」節 を参照してください。
回答があなたに個人的に送られて、メーリングリストに送られていないときは、 あなたの問題の解決の手助けになった返事の恩恵を他の人にも与える ために、回答を要約し、その要約をメーリングリストに送信することが、良いエチケットです。
あなたの回答が広く関心を持たれると考えられる場合、尋ねた人に個人的に直接 返事をする代わりに、メーリングリストに投稿したいと思うでしょう。元 の投稿者以外の人もそれから恩恵を受けられるように、十分に一般的な回答を作成 することを試みてください。メーリングリストに投稿する場合は、あなたの回答 が以前の回答と重複していないか確認して下さい。
あなた返事の中で、質問の本質部分の要約を試みてください。質問全体を引用す ることを義務と感じないで下さい。
HTML モードを ON にしたブラウザからメールメッセージを投稿しないでくださ い。多くのユーザはブラウザでメールを読んでいません。
いろいろなMySQLのメーリングリストに加え、IRC
(Internet Relay Chat
)
に経験を積んだコミュニティの人がいます。次は、わたしたちが知っている、
現在のよい networks/channels です:
#mysql
基本はMySQLの質問、しかしほかのデータベースやSQLの質問も歓迎されます。
#mysqlphp
MySQL+PHP、人気の高い組み合わせ、の質問です。
#mysql
MySQL の質問
IRCネットワークに接続するIRCクライアントソフトウェアを探して
いるならば、X-Chat
(http://www.xchat.org/)を見て
ください。X-Chatは、Unixだけではなく、Windowsのプラットフォー
ムでも使えます。
この章では、MySQL がどのように ANSI SQL 標準に関係するかを説明し ます。MySQL Server は ANSI SQL 標準に対して多くの拡張を持ちます。そして、 ここでそれらが何か、またそれらの使用方法を見つけられるでしょう。また、 MySQL Server に足りない機能についての情報と、いくつかの違いを回避する方 法も見つけられるでしょう。
わたしたちの目標は、どのように使ってもMySQL Serverの使いやすさを、正当な 理由なしで制限しないことです。可能性のあるすべての使い方に対する開発のリ ソースをもっていなくても、わたしたちは、新しい領域でMySQL Serverを使おう としている人たちに助けと提案を求めます。
製品へのわたしたちのひとつの主な目標は、速度と信頼性を犠牲にしないで、ANSI
99適合性に向かって進み続けることです。ユーザの多くにとってMySQL Serverの
使いやすさが大きく増すときには、SQLに拡張を加えたり、SQLにない機能を追加
したりすることを恐れません。(MySQL Server 4.0の新しいHANDLER
インタ
フェースはこの戦略の例です。 「6.4.2 HANDLER
Syntax」節参照.)
激しいウェブ/ログの使い方とミッションクリティカルな24/7(訳注:24時間/日、 7日/週のことと考えられる)の使い方の両方を満 たすために、トランザクションと非トランザクションデータベースをサポートし 続けます。
MySQL Serverは、小さなコンピュータシステムで、中規模なデータベース(1千万件 から1億件のレコード、またはひとつのテーブルあたり100Mバイト)で動作するとこ ろから設計し始めました。わたしたちはMySQL Serverがテラバイトのデータベース でも動作するように拡張し続けます。それと同じように、ハンドヘルド機器や組み 込み用途により適するように切りつめたMySQLバージョンをコンパイルできるように しています。MySQLサーバは設計が簡潔であるため、ソースツリーで競合しないでこ の両方の方向を採ることができます。
いまは、リアルタイムのサポートやクラスタ化されたデータベースのサポートを(レプ リケーションサービスで多くのことがすでにできていても)目標に置いていません。
ネイティブにXMLをサポートする必要はないと信じていますが、代わりにクライア ント側でXMLをサポートするようにわたしたちからユーザにお願いしようとしていま す。クライアント側で複雑さを取り扱うライブラリを開発するより、メインのサーバ のコードをできるかぎり「細身できれいに」しておくほうがよいと考えます。これが 前に述べた、サーバで速度と信頼性を犠牲にしない戦略の一部です。
エントリレベルではSQL92です。ODBCのレベルは0-3.51です。
ANSI SQL 99標準の全機能が使えるのが目標ですが、コードの速 度と品質には妥協しません。
mysqld
を-ansi
オプションをつけて起動すると、
MySQL Serverは次のように振る舞います:
||
* ||はORではなく、文字列の連結です。
REAL
は、DOUBLE
の別名ではなく、FLOAT
の別名にな
ります。
SET TRANSACTION
構文」節参照.
GROUP BY
のなかで、フィールドや式が使えます。
サーバをANSIモードで実行することは、次のオプションで開始することと同じです。
--sql-mode=REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,
IGNORE_SPACE,SERIALIZE,ONLY_FULL_GROUP_BY
.
MySQL Server は、他の SQL データベース内に見られないであろう、いくつか
の拡張を含んでいます。それらを使用すると、コードは他の SQL サー
バに移行できなくなるので注意してください。いくつかのケースでは、形式
/*! ... */
のコメントを使用することで、MySQL 拡張を含む
移行可能コードを書くことができます。この場合、MySQL Server はコメント
内のコードを実行しますが、ほかのSQLサーバはこれを無視します。例えば:
SELECT /*! STRAIGHT_JOIN */ col_name FROM table1,table2 WHERE ...
'!'
の後ろにバージョン番号を追加すると、文法は MySQL バー
ジョンが使用されるバージョン番号と等しいか大きい場合にのみ実行されます:
CREATE /*!32302 TEMPORARY */ TABLE t (a int);
上記は バージョン 3.23.02 かそれ以上の場合という意味で、そのとき MySQL Server は
TEMPORARY
キーワードを使用します。
MySQL 拡張を以下に示します:
MEDIUMINT
, SET
, ENUM
そして様々な
BLOB
と TEXT
型。
AUTO_INCREMENT
, BINARY
, NULL
, UNSIGNED
そして
ZEROFILL
。
BINARY
属性であなたのフィールドを宣言すべきです。これは、MySQL
サーバホストの上で使用される ASCII 順にしたがって比較されるようになり
ます。
db_name.tbl_name
構文を使用して、違うデータベースのテーブルにアクセスできます。
いくつかのSQLサーバは同様の機能を提供しますが、これを User space
と呼びます。
MySQL Server は以下のようなテーブルスペースをサポートしません:
create table ralph.my_table...IN my_tablespace
.
LIKE
が許されます。
SELECT
文内の INTO OUTFILE
と
STRAIGHT_JOIN
の使用。 「6.4.1 SELECT
構文」節参照.
SELECT
文でSQL_SMALL_RESULT
オプションが使えます。
EXPLAIN SELECT
。
CREATE TABLE
文
内の INDEX
または KEY
の使用。
「6.5.3 CREATE TABLE
構文」節参照.
CREATE TABLE
での TEMPORARY
か IF NOT EXISTS
の使用。
list
要素が一つ以上の COUNT(DISTINCT list)
の使用。
ALTER TABLE
文内の CHANGE col_name
, DROP col_name
,
DROP INDEX
, IGNORE
, RENAME
の使用。
「6.5.4 ALTER TABLE
構文」節参照.
RENAME TABLE
の使用。 「6.5.5 RENAME TABLE
構文」節参照。
ALTER TABLE
文内の複数の ADD
, ALTER
,
DROP
, CHANGE
節の使用。
IF EXISTS
付きの DROP TABLE
の使用。
DROP TABLE
で破棄できる
DELETE
文の LIMIT
節。
INSERT
と REPLACE
文の DELAYED
節。
INSERT
, REPLACE
, DELETE
, UPDATE
文
の LOW_PRIORITY
節。
LOAD DATA INFILE
の使用。多くの場合、この構文は ORACLE の
LOAD DATA INFILE
と互換があります。 「6.4.9 LOAD DATA INFILE
構文」節参照.
ANALYZE TABLE
とCHECK TABLE
、OPTIMIZE TABLE
、
REPAIR TABLE
文。
SHOW
文。
「4.5.6 SHOW
構文」節参照.
SET
文。 「5.5.6 SET
構文」節参照.
GROUP BY
部に詮索されたすべてのフィールドを持つ必要はありません。
これにより、特別で、しかしきわめて普通の問合せの性能が向上します。
「6.3.6.3 Functions for Use with GROUP BY
Clauses」節参照.
GROUP BY
とともに ASC
と DESC
を記述できます。
||
と &&
演算子を、C プログラミング言語
のように、論理和と論理積を意味すると理解します。MySQL では
||
と OR
、&&
と AND
は同義語です。この良い構
文のため、MySQL Server は ANSI SQL の文字列結合演算子 ||
をサポー
トしません。CONCAT()
を代わりに使用してください。CONCAT()
は任意の数の引数を使用できるので、||
演算子の使用を
MySQL Server に変換するのは簡単です。
CREATE DATABASE
または DROP DATABASE
.
「6.5.1 CREATE DATABASE
構文」節参照.
MOD()
と同義の %
。 N % M
は MOD(N,M)
と等価です。
%
は C プログラマと PostgreSQL との互換のためにあります。
=
, <>
, <=
,<
, >=
,>
,
<<
, >>
, <=>
, AND
, OR
, LIKE
演算子は、SELECT
文中で、FROM
の左側のフィールドの比較に
使用されます。
例えば:
mysql> SELECT col1=1 AND col2=2 FROM tbl_name;
LAST_INSERT_ID()
関数。
「8.4.3.130 mysql_insert_id()
」節参照.
REGEXP
と NOT REGEXP
正規表現演算子
CONCAT()
または CHAR()
。
MySQL Server では、これらの関数は任意の数の引数を取ることができます。
BIT_COUNT()
, CASE
, ELT()
,
FROM_DAYS()
, FORMAT()
, IF()
, PASSWORD()
,
ENCRYPT()
, md5()
, ENCODE()
, DECODE()
,
PERIOD_ADD()
, PERIOD_DIFF()
, TO_DAYS()
,
WEEKDAY()
関数。
TRIM()
が使えます。ANSI SQL では、ひとつの
文字だけを取り除くことしかできません。
GROUP BY
関数 STD()
, BIT_OR()
そして BIT_AND()
。
DELETE
+ INSERT
の代わりの REPLACE
の使用。
「6.4.8 REPLACE
構文」節参照.
FLUSH
, RESET
, DO
構文。
:=
で文内での変数の設定が可能:
SELECT @a:=SUM(total),@b=COUNT(*),@a/@b AS avg FROM test_table; SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;
私たちは MySQL Server を ANSI SQL 標準と ODBC SQL 標準にしたがうように しようとしていますが、いくつかの場合、MySQL Server には違いがあります:
--
は空白が続く場合だけコメントになります。
VARCHAR
フィールドでは、値が格納されるときに末尾の空白が削除されます。
「1.7.5 MySQLでの既知のエラーと欠けているデザイン」節参照。
CHAR
フィールドは黙って VARCHAR
フィール
ドに変更されます。 「6.5.3.1 暗黙のフィールド定義変更」節参照。
REVOKE
を発行する必
要があります。 「4.3.1 GRANT
と REVOKE
構文」節参照.
NULL AND FALSE
は FALSE
ではなく NULL
と評価されます。
この場合、多くの余計な条件を評価する必要があることは良いことではないと、
私たちは考えているからです。
次の機能が MySQL Server の現在のバージョンにはありません。新しい拡張の 優先度については、次を参考にしてください http://www.mysql.com/doc/en/TODO.html. これはこのマニュアル中の TODO リストの最新バージョンです。 「1.8 MySQL and The Future (The TODO)」節参照.
バージョン 4.0 までの MySQL Server は、
INSERT ... SELECT ...
と REPLACE ... SELECT ...
の形式だけで
入れ子のクエリが使えます。しかし、ほかのところでもIN()
が
使えます。副問合せは、4.1 の開発のツリーで実装中です。副問合せは、
4.1 の開発のツリーで開発されました。
しかし多くの場合、副問合せを使わないクエリに書き直せます:
SELECT * FROM table1 WHERE id IN (SELECT id FROM table2);
これは、次のように書き直せます:
SELECT table1.* FROM table1,table2 WHERE table1.id=table2.id;
問合せ:
SELECT * FROM table1 WHERE id NOT IN (SELECT id FROM table2); SELECT * FROM table1 WHERE NOT EXISTS (SELECT id FROM table2 WHERE table1.id=table2.id);
これは、次のように書き直せます:
SELECT table1.* FROM table1 LEFT JOIN table2 ON table1.id=table2.id WHERE table2.id IS NULL;
さらに複雑な副問合せでは、副問合せを保持するために一時テーブルを作成で
きます。しかし、この方法が使えない場合があります。この場合には、
DELETE
文でもっとも頻繁に遭遇します。DELETE
文
では、標準 SQL では(sub select の中を除いて)join が使え
ません。副問合せが MySQL Server で使えるようになるまで、この状況には2
つの選択肢があります。
最初の選択肢は、手続きプログラミング言語(Perl や PHP のような)を使用して、
SELECT
クエリを発行して削除されるレコードのプライマリキーを獲得し、
それから DELETE
文(DELETE FROM ... WHERE
... IN (key1, key2, ...)
)を組み立てるためにその値を使用することです。
二番目の選択肢は、対話型 SQL を使用し、DELETE
文の集まり
を、(標準 ||
オペレータの代わりに)MySQL 拡張
CONCAT()
を使用して、自動的に組み立てることです。例えば:
SELECT CONCAT('DELETE FROM tab1 WHERE pkid = ', "'", tab1.pkid, "'", ';') FROM tab1, tab2 WHERE tab1.col1 = tab2.col2;
このクエリをスクリプトファイル中に置き、入力を mysql
コマンドライン
インタプリタに切替え、その出力を二番目のインタプリタインスタンスにパイプし
ます:
shell> mysql --skip-column-names mydb < myscript.sql | mysql mydb
MySQL Server 4.0 は複数のテーブルを削除できます。これで、ひとつの 表から多くの表であっても、情報に基づいて同時に行を削除できます。
SELECT INTO TABLE
MySQL Server は、まだ、Oracle の SQL 拡張:
SELECT ... INTO TABLE ...
がありません。
代わりに、MySQL Server は、ANSI SQL 構文の
INSERT INTO ... SELECT ...
が使え、
基本的に同じことができます。
「6.4.3.1 INSERT ... SELECT
構文」節参照.
INSERT INTO tblTemp2 (fldID) SELECT tblTemp1.fldOrder_ID FROM tblTemp1 WHERE tblTemp1.fldOrder_ID > 100;
代わりに、SELECT INTO OUTFILE...
や CREATE
TABLE ... SELECT
が使えます。
MySQL Server では、InnoDB
と BDB
Transactional table
handlers
で、トランザクションが使えます。 「7 MySQL テーブル型」節参照。
InnoDB
が ACID
適合にします。
しかし、MyISM
といったMySQL Server のトランザクションでないテーブ
ル種は、``Atomic Operations
''(アトミック・オペレーション)と呼ばれ
る、データ一貫性のほかの方式にしたがいます。 アトミック・オペレーション
が同等かあるいはより良いパフォーマンスを提供するというのが、私たちの経験、
および考えです。MySQL Server では両方の方式があるため、ユーザは、アプリ
ケーションで、アトミック・オペレーションの速度が必要か、トランザクション
機能が必要か、決定できます。この選択は、テーブルごとにできます。
厳密に完全性を維持するには、MySQL Server の機能をどのように使用するので しょう? そして、トランザクションの方式でこれらの機能をどのように比較す るのでしょう?
COMMIT
の代わりに ROLLBACK
の呼び出しに依存しているなら、
トランザクションはより便利でしょう。おまけに、トランザクションは、完了で
きなかった更新や不整合を起こしたデータが、確実にデータベースに登録されな
いようにできます。そのサーバには、自動的な rollback をする機会が与えられ、
あなたのデータは守られるでしょう。MySQL Server では、ほとんどの場合、更
新前の簡単なチェックを含ませたり、データベースの矛盾を検査して自動的に修
復したり、警告の表示を行ったりする簡単なスクリプトを実行したりすることで、
発生しうる問題を解決できます。MySQL ログを使ったり外部へログを追加したり
することで、通常、データに不整合を起こさないで、テーブルを完全に修復でき
ることに注意してください。
LOCK TABLE
、または、原子的な更新で解決できます。これは、
トランザクション的なデータベースに共通の問題です。
LOCK TABLE
でテーブルをロックすると、一貫性の確認が済むまで、すべ
ての更新は待たされます。(書き込みロックと対称に)読み出しロックだけを取得
するときは読み出しと挿入は、まだ、許されます。新しく挿入されたレコードは、
読み込みロックをもったクライアントからは、読み込みロックを解放するまで見
えません。INSERT DELAYED
を使うと、挿入をローカルにある待ち行列に、
ロックを解放するまで、挿入が完了するまでクライアントを待たせることなく、
積むことができまます。 「6.4.4 INSERT DELAYED
構文」節参照.
ここでいう``Atomic''(原子性)は、魔法ではありません。ある特定の更新が実行
している間は、ほかのユーザは阻まれることを確実にすることを意味し、自動的
なロールバック(あまり注意を払わないときにトランザクション的なテーブルで
起きえる)が起きえないことだけです。また MySQL Server は、汚染された読み
込みが起きないことを保証します。
次は、トランザクションでないテーブルでのいくつかのテクニックです。
LOCK TABLES
, and you don't need cursors when you can update
records on the fly.
ROLLBACK
, you can use the following strategy:
LOCK TABLES ...
to lock all the tables you want to access.
UNLOCK TABLES
to release your locks.
ROLLBACK
s, although not always. The only situation
this solution doesn't handle is when someone kills the threads in the
middle of an update. In this case, all locks will be released but some
of the updates may not have been executed.
WHERE
clause in the UPDATE
statement. If the record wasn't
updated, we give the client a message: "Some of the data you have changed
has been changed by another user." Then we show the old row versus the new
row in a window, so the user can decide which version of the customer record
he should use.
This gives us something that is similar to column locking but is actually
even better because we only update some of the columns, using values that
are relative to their current values. This means that typical UPDATE
statements look something like these:
UPDATE tablename SET pay_back=pay_back+'relative change'; UPDATE customer SET customer_date='current_date', address='new address', phone='new phone', money_he_owes_us=money_he_owes_us+'new_money' WHERE customer_id=id AND address='old address' AND phone='old phone';As you can see, this is very efficient and works even if another client has changed the values in the
pay_back
or money_he_owes_us
columns.
ROLLBACK
and/or LOCK
TABLES
for the purpose of managing unique identifiers for some tables.
This can be handled much more efficiently by using an
AUTO_INCREMENT
column and either the SQL function
LAST_INSERT_ID()
or the C API function mysql_insert_id()
.
「8.4.3.130 mysql_insert_id()
」節参照.
You can generally code around row-level locking. Some situations really
need it, but they are very few. InnoDB
tables support row-level
locking. With MyISAM, you can use a flag column in the table and do
something like the following:
UPDATE tbl_name SET row_flag=1 WHERE id=ID;MySQL returns 1 for the number of affected rows if the row was found and
row_flag
wasn't already 1 in the original row.
You can think of it as though MySQL Server changed the preceding query to:
UPDATE tbl_name SET row_flag=1 WHERE id=ID AND row_flag <> 1;
ストアドプロシジャは、サーバ内でコンパイルでき格納できる SQL コマンドの 集まりです。一度これが行われると、クライアントはクエリ全体の再発行を保 持する必要がなく、ストアドプロシジャを参照できます。これはさらにより速い速度を提 供します。クエリは一度だけ解釈され、より少ないデータがサーバとクライアン ト間で送信されるからです。サーバ内に関数ライブラリを持つことによりレ ベルを上げることもできます。
トリガは特別なイベントが発生したときに呼び出されるストアドプロシジャです。 例えば、トランザクションテーブルからレコードが削除されるたびにトリガされ、 それに対応する顧客を顧客テーブルから自動的に削除するという、 ストアドプロシジャをインストールすることができます。
The planned update language will be able to handle stored procedures. Our aim is to have stored procedures implemented in MySQL Server around version 5.0. We are also looking at triggers.
注意: SQL の外部キーはテーブルを結合するためには使用できませんが、指示の
完全性の検査のために良く使用されます(foreign key constraints)。
SELECT
文で複数
テーブルから結果を得たい場合、テーブルの結合によってこれを行います:
SELECT * FROM table1,table2 WHERE table1.id = table2.id;
「6.4.1.1 JOIN
構文」節参照. 「3.5.6 Using Foreign Keys」節参照.
In MySQL Server 3.23.44 and up, InnoDB
tables support checking of
foreign key constraints. 「7.5 InnoDB
テーブル (3.23.6以上)」節参照. For other table types, MySQL Server
does parse the FOREIGN KEY
syntax in CREATE TABLE
commands, but without further action being taken.
MySQL 内での FOREIGN KEY
構文は、他の SQL ベンダの
CREATE TABLE
コマンドとの互換のためだけに存在します; これは何も行
ないません。ON DELETE ...
がない FOREIGN KEY
構文は、目的
の作成のために主に使われます。いくつかの ODBC アプリケーションは、自動的
に WHERE
節を提供するために、これを使用しますが、しかしこれは通常
簡単に無効にできます。FOREIGN KEY
はときどき強制チェックとして使用さ
れます。しかし、テーブルに正しい順で行が挿入される場合、このチェックは実
際には不要です。いくつかのアプリケーションがそれが存在することを要求する
ため MySQL はこれらの節だけをサポートします(それが動作するかど
うかに関わらず)。
MySQL Server では、外部キーを持つテーブルからレコードを削除するときに適
切な DELETE
文をアプリケーションに追加することで、
ON DELETE ...
が実装されていないという問題を回避できます。実際に
は、これは速く(いくつかの場合はより速く)そして外部キーの使用よりもさらに
可搬性があります。
In MySQL Server 4.0 you can use multi-table delete to delete rows from many
tables with one command. 「6.4.6 DELETE
構文」節参照.
In the near future we will extend the FOREIGN KEY
implementation
so that the information will be saved in the table specification file
and may be retrieved by mysqldump
and ODBC. At a later stage we
will implement the foreign key constraints for applications that can't
easily be coded to avoid them.
Do keep in mind that foreign keys are often misused, which can cause severe problems. Even when used properly, it is not a magic solution for the referential integrity problem, although it does make things easier in some cases.
Some advantages of foreign key enforcement:
Disadvantages:
It is planned to implement views in MySQL Server around version 5.0.
Views are mostly useful for letting users access a set of relations as one table (in read-only mode). Many SQL databases don't allow one to update any rows in a view, but you have to do the updates in the separate tables.
As MySQL Server is mostly used in applications and on web systems where the application writer has full control on the database usage, most of our users haven't regarded views to be very important. (At least no one has been interested enough in this to be prepared to finance the implementation of views.)
One doesn't need views in MySQL Server to restrict access to columns, as MySQL Server has a very sophisticated privilege system. 「4.2 General Security Issues and the MySQL Access Privilege System」節参照.
他のいくつかの SQL データベースは、`--' をコメントの開始のために使
用します。MySQL Server は `#' をコメント開始文字とします。
mysql
コマンドラインツールが `--' で始まる全ての行を削除した
としてもです。MySQL では C コメントスタイル /* これはコメ
ント */
も使用できます。 「6.1.6 コメント 構文」節参照。
MySQL Server バージョン 3.23.3 以上は `--' をサポートしません;
この退化したコメントスタイルは、次のコードのように !payment!
の
payment の値を自動的に挿入するような何かを使用して自動的に生成される
SQL クエリで多くの問題を引き起こすためです:
UPDATE tbl_name SET credit=credit-!payment!
payment
の値が負の場合に何が起きると思いますか?
1--1
は正しい SQL なので、私たちは `--' をコメント開始と見なす
ことはひどいことだと思います。
しかし MySQL Server バージョン 3.23 では次を使用できます:
1-- これはコメント
以降の説明では、バージョン 3.23 よりも前の MySQL を実行している場 合だけが対象です:
テキストファイルの SQL プログラムが `--' コメントを含んでいる場合、 次を使用すべきです:
shell> replace " --" " #" < text-file-with-funny-comments.sql \ | mysql database
通常の次の代わりに:
shell> mysql database < text-file-with-funny-comments.sql
次の方法でも、コマンドファイル中の `--' コメントを `#' コメン トに変更できます:
shell> replace " --" " #" -- text-file-with-funny-comments.sql
それらは次のコマンドで戻してください:
shell> replace " #" " --" -- text-file-with-funny-comments.sql
バージョン3.23でのエラーが、新しいバージョンで修正されました。 次のようなエラー・バグは、MySQL 3.23 では、修正されていませんでした。というのは、そうしたバグやエラーを直すことは、たくさんのコードの改変を伴うだろうからです。そしてこうした改変は、もっとひどい他のバグを生みかねません。そういうバグはまた、'not fatal'とか'bearable'にクラス分けされます。
LOCK TABLE
を実行し、同じコネクションで、マルティプル・テーブルのうち一つでDROP TABLE
を実行する場合には、デットロックを受けることがあり得ます。ですが、これを解決するために、関連するスレッドのいずれかに、KILL
を実行することができます。これは、4.0.12 における修正です。
SELECT MAX(key_column) FROM t1,t2,t3...
を実行しても、NULL
は返ってきません。それに代わって、フィールドの最大値を返します。これは、4.0.11における修正です。
次のような問題は、既知の問題で、優先的に処理されるべき問題です。
ANALYZE TABLE
は、場合によっては、mysqld
を再起動しなくては、テーブルを使用できなくするかもしれないものです。
これが起きた際には、MySQLのエラーファイルに、次のようなエラーが表示されるでしょう。
001207 22:07:56 bdb: log_flush: LSN past current end-of-log
BDB
テーブルで、ALTER TABLE
をexecuteしないでください。
(その処理は、恐らく無視されてしまうことでしょう。)
ANALYZE TABLE
と OPTIMIZE TABLE
と REPAIR TABLE
は、
それに INSERT DELAYED
を用いているテーブルに、問題を起こす原因になるかもしれないものです。
LOCK TABLE ...
と FLUSH TABLES ...
を行うことは、テーブル上で実行中のやりかけの処理がなくなることを、保証するものではありません。
-A
オプションを使っていたり、rehash
を使っている場合には、データーベース上で mysql
クライアントを使用するのには、時間がかかります。もしサイズの大きなテーブルを貯めこんでいるなら、これは特に気をつけなくてはいけないことです。
LOAD DATA INFILE
や、一文字以上の改行文字を、取り扱えません。
次の問題は、既知の問題ですが、期限内に解決されることでしょう。
RPAD
関数や右側にブランクを加えて終わる文字列関数を使う場合には、結果として得られる文字列は全て、RTRIM 化されてしまうことでしょう。これはクエリーの一例です:
SELECT RPAD(t1.field1, 50, ' ') AS f2, RPAD(t2.field2, 50, '
') AS f1 FROM table1 as t1 LEFT JOIN table2 AS t2 ON
t1.record=t2.joinID ORDER BY t2.record;
こうしたクエリーの使用をしても、結果として得られるフィールドの右側にブランクを得ることはできないでしょう、というのがこのバグの最終的な結果です。
上で挙げた動作というのは、MySQLの全てのバージョンにあることです。
これの原因は、最初に一時的なテーブルに用いられるHEAPテーブルが、VARCHARのカラムを取り扱うことができないことに起因します。
この動作は、4.1のリリースの一つで修正されることでしょう。
SET CHARACTER SET
を使う場合には、データーベースやテーブルやフィールドの名前に、翻訳された文字を使うことはできません。
LIKE ... ESCAPE
において、ESCAPE
と一緒に _
や %
を使うことはできません。
DECIMAL
カラムがある場合には、GROUP BY
はそれぞれの値を異なった値と見なします。
WHERE
抜きで用いられる DELETE FROM merge_table
は、テーブルのためのマッピングをクリアするだけです。マッピングされたテーブルにある全部を削除するわけではありません。
BLOB
の値は、ORDER BY
や ORDER BY
や DISTINCT
に用いる場合には、「信頼性」のないものになります。
これらの場合、 BLOB
の比較の際には最初の max_sort_length
バイト
(デフォルト1024)だけが使用されます。
これは mysqld
の -O max_sort_length
オプションで変更可能です。
ほとんどの場合には、substringを用いて行います。
SELECT DISTINCT LEFT(blob,2048) FROM tbl_name
といった具合に。
BIGINT
か DOUBLE
でなされます。(両方とも、普通は64ビットの長さです。)どちらを使うかというのは、計算結果を渡してくれる式によってしまいます。
bit関数は BIGINT
の精度でなされ、IF
と ELT()
は BIGINT
か DOUBLE
の精度でなされ、その他は DOUBLE
でなされるというのが、一般的なルールです。
One should try to
avoid using unsigned long long values if they resolve to be bigger than
63 bits (9223372036854775807) for anything else than bit fields!
MySQL Server 4.0 has better BIGINT
handling than 3.23.
BLOB
と TEXT
はのぞいて、は、
検索されるときに最後についているスペースを自動で取り除きます。
CHAR
型ではこれは OK で、この特徴は ANSI SQL92 に従っていると見なされるでしょう。
MySQL Server のバグは、 VARCHAR
でも同様に行ってしまうことです。
ENUM
と SET
のカラムは、255までしか使えません。
MIN()
や MAX()
や他の集計関数においては、MySQLは今のところ、その組み合わせの中での文字列の相対的な位置によるよりもむしろ、カラムの文字列の値によって、 ENUM
と SET
のカラムを比較しています。
mysqld_safe
(旧 safe_mysqld
) は、mysqld
からのメッセージの全てを、mysqld
ログにリダイレクトします。
これにともなう問題のひとつは、ログを開いたり、再び開いたりするために、mysqladmin refresh
を実行する場合には、stdout
と stderr
が、古いログにリダイレクトされたままだということです。広範囲にわたって --log
を用いる場合には、 `'hostname'.log' の代わりに `'hostname'.err' に記録するために、mysqld_safe
を編集すべきです。それで、古いものを削除し、m mysqladmin refresh
を実行することで、古いログのためのスペースを簡単に再利用することができます。
UPDATE
文において、カラムは左から右へと更新されます。更新されたカラムを参照する場合には、元の値の代わりに、更新された値が渡されることでしょう。例を見てみましょう。
mysql> UPDATE tbl_name SET KEY=KEY+1,KEY=KEY+1;これは、
KEY
を 1
の代わりに 2
で更新します。
mysql> SELECT * FROM temporary_table, temporary_table AS t2;
RENAME
は、 TEMPORARY
テーブルと一緒には、もしくは MERGE
テーブルの中のテーブルと一緒には実行できません。
DISTINCT
を違ったふうに扱います。テーブル結合においては、hiddenカラムは、結果の一部として数えられます。(たとえカラムが表示されなくてもです。)一方で、普通のクエリーにおいては、hiddenカラムは DISTINCT
比較には加えられません。 DISTINCT
を実行する際には、hiddenカラムを決して比較できないように、将来的には恐らく変えることでしょう。
これの実例は次のようなものです。
SELECT DISTINCT mp3id FROM band_downloads WHERE userid = 9 ORDER BY id DESC;そして
SELECT DISTINCT band_downloads.mp3id FROM band_downloads,band_mp3 WHERE band_downloads.userid = 9 AND band_mp3.id = band_downloads.mp3id ORDER BY band_downloads.id DESC;二番目のケースでは、MySQLサーバー3.23.xでは、リザルトセットでは二つの同じ列を渡してくるかもしれません。(というのも、隠れた
id
カラムは異なっているかもしれないからです。)
これは、ORDER BYしたカラムを結果のところで指定しないようなクエリー、ANSI SQLでは認められていないことをしたクエリーのみについて起こることだとといことに、気をつけてください。
NULL
の値をとらないカラムの中に NULL
を記録したい場合には、MySQLサーバーは、0か’’(空の文字列)をその代わりにその中に記録するでしょう。(ですがこの動作は、-DDONT_USE_DEFAULT_FIELDSコンパイルオプションで、変えることが出来ます。)
DATE
と DATETIME
のカラムに、いくつかの誤った日付(2000-02-31とか2000-02-00のような)の値を記録することができます。これは、日付を確認するというのは、SQLサーバーの仕事ではない、という考えから来ています。MySQLが日付を記録し、全く同じ日付に訂正できる場合には、MySQLはその日付を記録することでしょう。もしその日付が全く間違っている(日付を記録するサーバーの性能を越えている)ならば、それならば特別な日付の値0000-00-00が、カラムの中に記録されることでしょう。
ENUM
カラムに、サポートされていない値をセットするならば、それはエラーの値である空の文字列、数値の0をセットするでしょう。
SET
カラムに、サポートされていない値をセットするならば、その値は無視されるでしょう。
PROCEDURE
を実行するならば、幾つかの場合には、 PROCEDURE
はそのカラムを変えることはないでしょう。
MERGE
型のテーブルの作成する際には、強調されているテーブルの型に互換性があるかどうかは、チェックされません。
NaN
やダブル型の値の -Inf
や Inf
を、まだ扱えません。これらを使用することは、データをエクスポートしたりインポートしたりする際の問題の原因になるでしょう。中間的な解決として、 NaN
を NULL
に、 -Inf
や Inf
を各々の最小限の double
型のとりうる最大値に変更しなくてはなりません。
LIMIT
は、大きな正の数値として扱われます。
MERGE
テーブルにおいて用いられるテーブルに、 UNIQUE
インデックスを先ず加えるために、 ALTER TABLE
を用いるならば、さらに MERGE
テーブル上で普通のインデックスを加えるために、 ALTER TABLE
を用いるならば、そのテーブルの中ではユニークではなかった古いキーがあった場合には、キーの順番はテーブルごとに異なっていることでしょう。これは、 ALTER TABLE
が、重複キーをなるべく速く検知できるようにするために、普通のキーの前に、 UNIQUE
キーをおくからです。
以下のものが、MySQLの以前のバージョンにおいて知られていたバグです。:
LOCK TABLES
でロックされたような多くのテーブルの中の一つであるテーブルを、 DROP TABLE
する場合には、hungスレッドが取得されます。
WRITE
をともなう LOCK table
FLUSH TABLES
.
WHERE
を有するキーを更新する UPDATE
は、失敗するかもしれません。というのは、そのキーはレコードを検索するために、用いられ、全く同じ列が複数回にわたり見出されたかもしれないからです。:
UPDATE tbl_name SET KEY=KEY+1 WHERE KEY > 100;代替手段は、次のように使うことです:
mysql> UPDATE tbl_name SET KEY=KEY+1 WHERE KEY+0 > 100;MySQLサーバーが、
WHERE
句の表現の中にあるインデックスを用いることはないでしょうから、これは動作します。
プラットホームに特有のバグについては、コンパイリングとポーティングについての節を参照してください。
This section lists the features that we plan to implement in MySQL Server.
もしあなたが優先順位に影響を及ぼしたければ、どうかライセンスかサポート登録して、 私たちにあなたがより速く欲しいものを言ってください。 「1.4 MySQL ライセンスとサポート」節参照.
The plan is that we in the future will support the full ANSI SQL99 standard, but with a lot of useful extensions. The challenge is to do this without sacrificing the speed or compromising the code.
All done. We now only do bug fixes for MySQL 4.0. 「D.3 Changes in release 4.0.x (Gamma)」節参照. Development has shifted to 4.1 & 5.0
The following features are planned for inclusion into MySQL 4.1. For a list what is already done in MySQL 4.1, see 「D.2 Changes in release 4.1.x (Alpha)」節参照.
The following features are planned for inclusion into MySQL 5.0. Note that because we have many developers that are working on different projects, there will also be many additional features. There is also a small chance that some of these features will be added to MySQL 4.1. For a list what is already done in MySQL 4.1, see 「D.2 Changes in release 4.1.x (Alpha)」節参照.
SHOW COLUMNS FROM table_name
(used by mysql
client to allow
expansions of column names) should not open the table, only the
definition file. This will require less memory and be much faster.
ROLLUP
and CUBE
OLAP (Online Analytical Processing) grouping
options for data warehousing applications.
DELETE
on MyISAM
tables to use the record cache.
To do this, we need to update the threads record cache when we update
the `.MYD' file.
SET CHARACTER SET
we should translate the whole query
at once and not only strings. This will enable users to use the translated
characters in database, table, and column names.
RENAME TABLE
on a table used in an active
MERGE
table possibly corrupting the table.
RENAME DATABASE
. To make this safe for all storage engines,
it should work as follows:
RENAME
command.
VARCHAR
support (there is already support for this in
MyISAM
).
BIT
型を 1 bit 取るように最適化 (今 BIT
は一文字とります)
HEAP
) tables:
INSERT ... SELECT
to optionally use concurrent inserts.
SELECT MIN(column)
... GROUP BY
.
long_query_time
with a granularity
in microseconds.
myisampack
code into the server.
INSERT/DELETE/UPDATE
so that we
can gracefully recover if the index file gets full.
ALTER TABLE
を
実行した場合、一時テーブルをこの disk に作成するようにする
DATE/DATETIME
type that handles time zone information
properly so that dealing with dates in different time zones is easier.
MyISAM
)
without threads.
INSERT SQL_CONCURRENT
and mysqld --concurrent-insert
to do
a concurrent insert at the end of the file if the file is read-locked.
lockd
works with modern Linux kernels; if not, we have
to fix lockd
! To test this, start mysqld
with
--enable-locking
and run the different fork* test suits. They shouldn't
give any errors if lockd
works.
LIMIT
, like in LIMIT @a,@b
.
UPDATE
statements. For example:
UPDATE TABLE foo SET @a=a+b,a=@a, b=@a+c
.
GROUP BY
, as in the following example:
SELECT id, @a:=COUNT(*), SUM(sum_col)/@a FROM table_name GROUP BY id
.
DEFAULT
values to columns. Give an error when using
an INSERT
that doesn't contain a column that doesn't have a
DEFAULT
.
mysql_query()
commands in a row
without reading results or give a nice error message when one does this.
ctime()
が動かないか検証。
TIMESTAMP
と AUTO_INCREMENT
フィールドを更新しないように、
IMAGE
オプションを LOAD DATA INFILE
に追加。
LOAD DATE INFILE ... UPDATE
syntax.
LOAD DATA INFILE ... REPLACE INTO
now.
LOAD DATA INFILE
understand syntax like:
LOAD DATA INFILE 'file_name.txt' INTO TABLE tbl_name TEXT_FIELDS (text_field1, text_field2, text_field3) SET table_field1=CONCAT(text_field1, text_field2), table_field3=23 IGNORE text_field3This can be used to skip over extra columns in the text file, or update columns based on expressions of the read data.
LOAD DATA INFILE 'file_name' INTO TABLE 'table_name' ERRORS TO err_table_name
.
This would cause any errors and warnings to be logged into the
err_table_name
table. That table would have a structure like:
line_number - line number in datafile error_message - the error/warning message and maybe data_line - the line from the datafile
mysql
から自動的に Netscape に出力
LOCK DATABASES
. (いろいろなオプション付きで)
t1 JOIN t2 ON ...
と t1 JOIN t2 USING ...
の使用の追加。
現在、 LEFT JOIN
のみが使用できます。
show status
. Records reads and
updates. Selects on 1 table and selects with joins. Mean number of
tables in select. Number of ORDER BY
and GROUP BY
queries.
mysql
in the middle of a query, you should open
another connection and kill the old running query.
Alternatively, an attempt should be made to detect this in the server.
SHOW INFO FROM tbl_name
for basic table information
should be implemented.
SELECT a FROM crash_me LEFT JOIN crash_me2 USING (a)
; in this
case a
is assumed to come from the crash_me
table.
CONNECT BY PRIOR ...
to search hierarchy structures.
mysqladmin copy database new-database
; requires COPY
command to be added to mysqld
.
SHOW HOSTS
for printing information about the hostname cache.
DELETE
and REPLACE
options to the UPDATE
statement
(this will delete rows when one gets a duplicate key error while updating).
DATETIME
to store fractions of seconds.
NULL
for calculated columns.
Item_copy_string
on numerical values to avoid
number->string->number conversion in case of:
SELECT COUNT(*)*(id+0) FROM table_name GROUP BY id
ALTER TABLE
doesn't abort clients
that execute INSERT DELAYED
.
UPDATE
clause,
they contain the old values from before the update started.
pread()
/pwrite()
on Windows to enable
concurrent inserts.
SUM(DISTINCT)
.
ANY()
, EVERY()
, and SOME()
group functions. In
ANSI SQL these work only on boolean columns, but we can extend these to
work on any columns/expressions by applying: value == 0 -> FALSE and
value <> 0 -> TRUE.
MAX(column)
is the same as the column type:
mysql> CREATE TABLE t1 (a DATE); mysql> INSERT INTO t1 VALUES (NOW()); mysql> CREATE TABLE t2 SELECT MAX(a) FROM t1; mysql> SHOW COLUMNS FROM t2;
UPDATE
the row
if it exists and INSERT
a new row if the row didn't exist
(like REPLACE
works with INSERT
/ DELETE
).
get_changed_tables(timeout,table1,table2,...)
.
SET TIMESTAMP=#;
.
MyISAM
tables, probably after
the implementation of stored procedures with triggers.
MINUS
, INTERSECT
, and FULL OUTER JOIN
.
(Currently UNION
[in 4.0] and LEFT OUTER JOIN
are supported.)
SQL_OPTION MAX_SELECT_TIME=#
to put a time limit on a query.
LIMIT
to allow retrieval of data from the end of a result set.
safe_mysqld
: according to FSSTND (which
Debian tries to follow) PID files should go into `/var/run/<progname>.pid'
and log files into `/var/log'. It would be nice if you could put the
"DATADIR" in the first declaration of "pidfile" and "log", so the
placement of these files can be changed with a single statement.
zlib()
for gzip
-ed files to LOAD DATA INFILE
.
BLOB
columns (partly solved now).
AUTO_INCREMENT
value when one sets a column to 0.
Use NULL
instead.
JOIN
with parentheses.
GET_LOCK
. When doing this,
one must also handle the possible deadlocks this change will introduce.
Time is given according to amount of work, not real time.
Our users have successfully run their own benchmarks against a number
of Open Source
and traditional database servers.
We are aware of tests against Oracle
server, DB/2
server,
Microsoft SQL Server
, and other commercial products.
Due to legal reasons we are restricted from publishing some of those
benchmarks in our reference manual.
This section includes a comparison with mSQL
for historical
reasons and with PostgreSQL
as it is also an Open Source
database. If you have benchmark results that we can publish, please
contact us at benchmarks@mysql.com.
For comparative lists of all supported functions and types as well
as measured operational limits of many different database systems,
see the crash-me
web page at
http://www.mysql.com/information/crash-me.php.
mSQL
mSQL
should be quicker at:
INSERT
operations into very simple tables with few columns and keys.
CREATE TABLE
and DROP TABLE
.
SELECT
on something that isn't an index. (A table scan is very
easy.)
mSQL
や多くの他の SQL 実装よりとても速いです:
SELECT
operations.
VARCHAR
上にインデックスを持つことができます。
SELECT
with many expressions.
SELECT
on large tables.
mSQL
では、全ての他の接続は、最初のもの - クエリが長いか短いかに
関わらず - が実行され、終わるまで待つ必要があります。その後次の接続が与
えられ、他の全ては再び待ちます。
mSQL
can become pathologically slow if you change the order of
tables in a SELECT
. In the benchmark suite, a time more than
15,000 times slower than MySQL Server was seen. This is due to mSQL
's
lack of a join optimiser to order tables in the optimal order.
However, if you put the tables in exactly the right order in
mSQL
2 and the WHERE
is simple and uses index columns,
the join will be relatively fast!
「5.1.4 The MySQL Benchmark Suite」節参照.
ORDER BY
and GROUP BY
.
DISTINCT
.
TEXT
または BLOB
フィールドの使用。
GROUP BY
and HAVING
.
mSQL
does not support GROUP BY
at all.
MySQL Server supports a full GROUP BY
with both HAVING
and
the following functions: COUNT()
, AVG()
, MIN()
,
MAX()
, SUM()
, and STD()
. COUNT(*)
is
optimised to return very quickly if the SELECT
retrieves from
one table, no other columns are retrieved, and there is no
WHERE
clause. MIN()
and MAX()
may take string
arguments.
INSERT
and UPDATE
with calculations.
MySQL Server can do calculations in an INSERT
or UPDATE
.
For example:
mysql> UPDATE SET x=x*10+y WHERE x<20;
SELECT
with functions.
MySQL Server has many functions (too many to list here; see 「6.3 SELECT
と WHERE
節で使用する関数」節).
MEDIUMINT
です。10,000,000 レコードを持つ場合、1レコードあたり1バイトの節約でもと
ても重要です。
mSQL2
は4つの型(char,text,int,real)しかないので、小さなテーブルを
得るのは難しいです。
mSQL
安定性の経験がありません。そのため、私たちはこれにつ
いては何も言えません。
mSQL
よりも柔軟なライセンスを持っています。そして mSQL
よ
りもより安いです。少なくとも、あなたが使用を選択した製品全てに、ライセン
スまたは email サポートへの支払いを考慮することを覚えていて下さい。
MySQL を含めた製品を売る場合、もちろんこのライセンスの獲得が要求
されます。
mSQL
と同じ perl インタフェースと、いくつかの追
加機能を持ちます。
mSQL
has a JDBC driver, but we have too little
experience with it to compare.
GROUP BY
などはまだ
mSQL
には実装されていませんので、追いつくにはたくさんのことをしなければなりません。
この上でいくつかの見通しを得るために、去年の mSQL
`HISTORY' ファ
イルを見て、MySQL Reference Manual News 節と比較できます( 「D MySQL Change History」節)。
速く開発された多くのものが、かなり明白になります。
mSQL
と MySQL は多くの興味深いサードパーティツールを持っ
ています。上位への移行 (mSQL
-> MySQL) はとても簡単です。
MySQL は、ほとんど全ての興味深い mSQL
アプリケーションを
持っています。
MySQL には、簡単な msql2mysql
プログラムが用意されています。
これは、mSQL
と MySQL の C API 関数のスペルの違いを修正するプログラムです。
たとえば、mysqlConnect()
のインスタンスを変えるには、
mysql_connect()
.
mSQL
から MySQL への変換は通常、数分使用するだけです。
mSQL
Tools for MySQL
According to our experience, it doesn't take long to convert tools
such as msql-tcl
and msqljava
that use the
mSQL
C API so that they work with the MySQL C API.
The conversion procedure is:
msql2mysql
をソースに実行します。バイナリプログラム
replace
が必要です。これは MySQL で配布されます。
MySQL と mSQL
間の C API の違い:
MYSQL
構造体を接続型として使用します (mSQL
は
int
を使用します)。
mysql_connect()
は MYSQL
構造体へのポインタをパラメータとして使用します。そ
れをグローバルに定義したり、その獲得に malloc()
を使用するのは簡単です。
mysql_connect()
ユーザ飛ばすワードを識別する二つのパラメータを取ります。
デフォルトで使うときにはNULL, NULL
を指定します。
mysql_error()
は MYSQL
構造体をパラメータとして使用します。古いコードを移
行する場合、あなたの古い msql_error()
コードへパラメータを追加してください。
mSQL
はテキストのエラーメッセージしか返しません。
mSQL
and MySQL Client/Server Communications Protocols DifferThere are enough differences that it is impossible (or at least not easy) to support both.
The most significant ways in which the MySQL protocol differs
from the mSQL
protocol are listed here:
mSQL
2.0 SQL Syntax Differs from MySQLColumn types
MySQL Server
CREATE TABLE
構文」節):
ENUM
type for one of a set of strings.
SET
type for many of a set of strings.
BIGINT
type for 64-bit integers.
UNSIGNED
option for integer and floating-point columns.
ZEROFILL
option for integer columns.
AUTO_INCREMENT
option for integer columns that are a
PRIMARY KEY
.
「8.4.3.130 mysql_insert_id()
」節参照.
DEFAULT
value for all columns.
mSQL2
mSQL
column types correspond to the MySQL types shown in the following table:
mSQL type | Corresponding MySQL type |
CHAR(len) | CHAR(len)
|
TEXT(len) | TEXT(len) . len is the maximal length.
And LIKE works.
|
INT | INT . With many more options!
|
REAL | REAL . Or FLOAT . Both 4- and 8-byte versions are available.
|
UINT | INT UNSIGNED
|
DATE | DATE . Uses ANSI SQL format rather than mSQL 's own format.
|
TIME | TIME
|
MONEY | DECIMAL(12,2) . A fixed-point value with two decimals.
|
Index Creation
MySQL Server
CREATE TABLE
statement.
mSQL
CREATE INDEX
statements.
To Insert a Unique Identifier into a Table
MySQL Server
AUTO_INCREMENT
as a column type
specifier.
「8.4.3.130 mysql_insert_id()
」節参照.
mSQL
SEQUENCE
on a table and select the _seq
column.
To Obtain a Unique Identifier for a Row
MySQL Server
PRIMARY KEY
or UNIQUE
key to the table and use this.
New in Version 3.23.11: If the PRIMARY
or UNIQUE
key consists of only one
column and this is of type integer, one can also refer to it as
_rowid
.
mSQL
_rowid
column. Observe that _rowid
may change over time
depending on many factors.
To Get the Time a Column Was Last Modified
MySQL Server
TIMESTAMP
column to the table. This column is automatically set
to the current date and time for INSERT
or UPDATE
statements if
you don't give the column a value or if you give it a NULL
value.
mSQL
_timestamp
column.
NULL
Value Comparisons
MySQL Server
NULL
is always NULL
.
mSQL
mSQL
, NULL = NULL
is TRUE. You
must change =NULL
to IS NULL
and <>NULL
to
IS NOT NULL
when porting old code from mSQL
to MySQL Server.
String Comparisons
MySQL Server
BINARY
attribute, which causes comparisons to be done according to the
ASCII order used on the MySQL server host.
mSQL
Case-insensitive Searching
MySQL Server
LIKE
is a case-insensitive or case-sensitive operator, depending on
the columns involved. If possible, MySQL uses indexes if the
LIKE
argument doesn't start with a wildcard character.
mSQL
CLIKE
.
Handling of Trailing Spaces
MySQL Server
CHAR
and VARCHAR
columns. Use a TEXT
column if this behaviour is not desired.
mSQL
WHERE
Clauses
MySQL Server
AND
is evaluated
before OR
). To get mSQL
behaviour in MySQL Server, use
parentheses (as shown in an example later in this section).
mSQL
mSQL
query:
mysql> SELECT * FROM table WHERE a=1 AND b=2 OR a=3 AND b=4;To make MySQL Server evaluate this the way that
mSQL
would,
you must add parentheses:
mysql> SELECT * FROM table WHERE (a=1 AND (b=2 OR (a=3 AND (b=4))));
Access Control
MySQL Server
mSQL
PostgreSQL
When reading the following, please note that both products are continually evolving. We at MySQL AB and the PostgreSQL developers are both working on making our respective databases as good as possible, so we are both a serious alternative to any commercial database.
The following comparison is made by us at MySQL AB. We have tried to be as accurate and fair as possible, but although we know MySQL Server thoroughly, we don't have a full knowledge of all PostgreSQL features, so we may have got some things wrong. We will, however, correct these when they come to our attention.
We would first like to note that PostgreSQL and MySQL Server are both widely used
products, but with different design goals, even if we are both striving
toward ANSI SQL compliancy. This means that for some applications MySQL Server
is more suited, while for others PostgreSQL is more suited. When choosing
which database to use, you should first check if the database's feature set
satisfies your application. If you need raw speed, MySQL Server is probably your
best choice. If you need some of the extra features that only PostgreSQL
can offer, you should use PostgreSQL
.
When adding things to MySQL Server we take pride to do an optimal, definite solution. The code should be so good that we shouldn't have any need to change it in the foreseeable future. We also do not like to sacrifice speed for features but instead will do our utmost to find a solution that will give maximal throughput. This means that development will take a little longer, but the end result will be well worth this. This kind of development is only possible because all server code are checked by one of a few (currently two) persons before it's included in the MySQL server.
We at MySQL AB believe in frequent releases to be able to push out new features quickly to our users. Because of this we do a new small release about every three weeks, and a major branch every year. All releases are thoroughly tested with our testing tools on a lot of different platforms.
PostgreSQL is based on a kernel with lots of contributors. In this setup it makes sense to prioritise adding a lot of new features, instead of implementing them optimally, because one can always optimise things later if there arises a need for this.
Another big difference between MySQL Server and PostgreSQL is that nearly all of the code in the MySQL server is coded by developers that are employed by MySQL AB and are still working on the server code. The exceptions are the transaction engines and the regexp library.
This is in sharp contrast to the PostgreSQL code, the majority of which is coded by a big group of people with different backgrounds. It was only recently that the PostgreSQL developers announced that their current developer group had finally had time to take a look at all the code in the current PostgreSQL release.
Both of the aforementioned development methods have their own merits and drawbacks. We here at MySQL AB think, of course, that our model is better because our model gives better code consistency, more optimal and reusable code, and in our opinion, fewer bugs. Because we are the authors of the MySQL server code, we are better able to coordinate new features and releases.
On the crash-me
page
(http://www.mysql.com/information/crash-me.php)
you can find a list of those database constructs and limits that
one can detect automatically with a program. Note, however, that a lot of
the numerical limits may be changed with startup options for their respective
databases. This web page is, however, extremely useful when you want to
ensure that your applications work with many different databases or
when you want to convert your application from one database to another.
MySQL Server offers the following advantages over PostgreSQL:
MySQL
Server is generally much faster than PostgreSQL. MySQL
4.0.1 also has a query cache that can boost up the query speed for
mostly-read-only sites many times.
Cygwin
emulation. We have
heard that PostgreSQL is not yet that stable on Windows but we haven't
been able to verify this ourselves.
VACUUM
once in a while to reclaim space from UPDATE
and DELETE
commands and to perform statistics analyses that are critical to get
good performance with PostgreSQL. VACUUM
is also needed after
adding a lot of new rows to a table. On a busy system with lots of changes,
VACUUM
must be run very frequently, in the worst cases even
many times a day. During the VACUUM
run, which may take hours
if the database is big, the database is, from a production standpoint,
practically dead. Please note: in PostgreSQL version 7.2, basic vacuuming
no longer locks tables, thus allowing normal user access during the vacuum.
A new VACUUM FULL
command does old-style vacuum by locking the table
and shrinking the on-disk copy of the table.
crash-me
(http://www.mysql.com/information/crash-me.php), as well
as a benchmark suite. The test system is actively updated with code to
test each new feature and almost all reproduceable bugs that have come to
our attention. We test MySQL Server with these on a lot of platforms before
every release. These tests are more sophisticated than anything we have
seen from PostgreSQL, and they ensure that the MySQL Server is kept to a high
standard.
PostgreSQL
.
ALTER TABLE
.
HEAP
tables or disk based MyISAM
. 「7 MySQL テーブル型」節参照.
InnoDB
, and BerkeleyDB
. Because every
transaction engine performs differently under different conditions, this
gives the application writer more options to find an optimal solution for
his or her setup, if need be per individual table. 「7 MySQL テーブル型」節参照.
MERGE
tables gives you a unique way to instantly make a view over
a set of identical tables and use these as one. This is perfect for
systems where you have log files that you order, for example, by month.
「7.2 MERGE
Tables (3.23.25以上)」節参照.
myisampack
, MySQL の圧縮された読み込み専用テーブルジェネレータ」節参照.
INSERT
,
SELECT
, and UPDATE/DELETE
grants per user on a database or
a table, MySQL Server allows you to define a full set of different
privileges on the database, table, and column level. MySQL Server also
allows you to specify the privilege on host and user combinations.
「4.3.1 GRANT
と REVOKE
構文」節参照.
InnoDB
) are implemented as files
(one table per file), which makes it really easy to back up, move, delete,
and even symlink databases and tables, even when the server is down.
MyISAM
tables (the most common
MySQL table type). A repair tool is only needed when a physical corruption
of a datafile happens, usually from a hardware failure. It allows a
majority of the data to be recovered.
Drawbacks with MySQL Server compared to PostgreSQL:
MyISAM
tables, is
in many cases faster than page locks, row locks, or versioning. The
drawback, however, is that if one doesn't take into account how table
locks work, a single long-running query can block a table for updates
for a long time. This can usually be avoided when designing the
application. If not, one can always switch the trouble table to use one
of the transactional table types. 「5.3.2 テーブル・ロッキングの問題」節参照.
UPDATE
and in MySQL Server 4.1 with subqueries.
In MySQL Server 4.0 one can use multi-table deletes to delete from many
tables at the same time. 「6.4.6 DELETE
構文」節参照.
PostgreSQL currently offers the following advantages over MySQL Server:
Note that because we know the MySQL road map, we have included in the following table the version when MySQL Server should support this feature. Unfortunately we couldn't do this for previous comparisons, because we don't know the PostgreSQL roadmap.
Feature | MySQL version |
Subqueries | 4.1 |
Foreign keys | 5.0 (3.23 with InnoDB) |
Views | 5.0 |
Stored procedures | 5.0 |
Triggers | 5.0 |
Unions | 4.0 |
Full join | 4.1 |
Constraints | 4.1 or 5.0 |
Cursors | 4.1 or 5.0 |
R-trees | 4.1 (for MyISAM tables) |
Inherited tables | Not planned |
Extensible type system | Not planned |
Other reasons someone may consider using PostgreSQL:
Drawbacks with PostgreSQL compared to MySQL Server:
VACUUM
makes PostgreSQL hard to use in a 24/7 environment.
INSERT
, DELETE
, and UPDATE
.
For a complete list of drawbacks, you should also examine the first table in this section.
The only Open Source
benchmark that we know of that can be used to
benchmark MySQL Server and PostgreSQL (and other databases) is our own. It can
be found at http://www.mysql.com/information/benchmarks.html.
We have many times asked the PostgreSQL developers and some PostgreSQL users to help us extend this benchmark to make it the definitive benchmark for databases, but unfortunately we haven't gotten any feedback for this.
We, the MySQL developers, have, because of this, spent a lot of hours to get maximum performance from PostgreSQL for the benchmarks, but because we don't know PostgreSQL intimately, we are sure that there are things that we have missed. We have on the benchmark page documented exactly how we did run the benchmark so that it should be easy for anyone to repeat and verify our results.
The benchmarks are usually run with and without the --fast
option.
When run with --fast
we are trying to use every trick the server can
do to get the code to execute as fast as possible. The idea is that the
normal run should show how the server would work in a default setup and
the --fast
run shows how the server would do if the application
developer would use extensions in the server to make his application run
faster.
When running with PostgreSQL and --fast
we do a VACUUM
after every major table UPDATE
and DROP TABLE
to make the
database in perfect shape for the following SELECT
s. The time for
VACUUM
is measured separately.
When running with PostgreSQL 7.1.1 we could, however, not run with
--fast
because during the INSERT
test, the postmaster (the
PostgreSQL daemon) died and the database was so corrupted that it was
impossible to restart postmaster. After this happened twice, we decided
to postpone the --fast
test until the next PostgreSQL release. The
details about the machine we run the benchmark on can be found on the
benchmark page.
Before going to the other benchmarks we know of, we would like to give some background on benchmarks.
It's very easy to write a test that shows any database to be the best database in the world, by just restricting the test to something the database is very good at and not testing anything that the database is not good at. If one, after doing this, summarises the result as a single figure, things are even easier.
This would be like us measuring the speed of MySQL Server compared to PostgreSQL by looking at the summary time of the MySQL benchmarks on our web page. Based on this MySQL Server would be more than 40 times faster than PostgreSQL, something that is, of course, not true. We could make things even worse by just taking the test where PostgreSQL performs worst and claim that MySQL Server is more than 2000 times faster than PostgreSQL.
The case is that MySQL does a lot of optimisations that PostgreSQL doesn't do. This is, of course, also true the other way around. An SQL optimiser is a very complex thing, and a company could spend years just making the optimiser faster and faster.
When looking at the benchmark results you should look for things that you do in your application and just use these results to decide which database would be best suited for your application. The benchmark results also show things a particular database is not good at and should give you a notion about things to avoid and what you may have to do in other ways.
We know of two benchmark tests that claim that PostgreSQL performs better than MySQL Server. These both where multi-user tests, a test that we here at MySQL AB haven't had time to write and include in the benchmark suite, mainly because it's a big task to do this in a manner that is fair to all databases.
One is the benchmark paid for by Great Bridge, the company that for 16 months attempted to build a business based on PostgreSQL but now has ceased operations. This is probably the worst benchmark we have ever seen anyone conduct. This was not only tuned to only test what PostgreSQL is absolutely best at, but it was also totally unfair to every other database involved in the test.
Note: We know that even some of the main PostgreSQL developers did not like the way Great Bridge conducted the benchmark, so we don't blame the PostgreSQL team for the way the benchmark was done.
This benchmark has been condemned in a lot of postings and newsgroups, so here we will just briefly repeat some things that were wrong with it.
Open Source
company like us to verify the benchmarks,
or even check how the benchmarks were really done. The tool is not even
a true benchmark tool, but an application/setup testing tool. To refer
to this as a ``standard'' benchmark tool is to stretch the truth a long way.
VACUUM
before the test) and tuned the startup for the tests,
something they hadn't done for any of the other databases involved. They
say ``This process optimises indexes and frees up disk space a bit. The
optimised indexes boost performance by some margin.'' Our benchmarks
clearly indicate that the difference in running a lot of selects on a
database with and without VACUUM
can easily differ by a factor
of 10.
SELECT
s and JOIN
s (especially
after a VACUUM
), but doesn't perform as well on INSERT
s or
UPDATE
s. The benchmarks seem to indicate that only SELECT
s
were done (or very few updates). This could easily explain the good results
for PostgreSQL in this test. The bad results for MySQL will be obvious a
bit down in this document.
Tim Perdue, a long-time PostgreSQL fan and a reluctant MySQL user, published a comparison on PHPbuilder (http://www.phpbuilder.com/columns/tim20001112.php3).
When we became aware of the comparison, we phoned Tim Perdue about this because there were a lot of strange things in his results. For example, he claimed that MySQL Server had a problem with five users in his tests, when we know that there are users with similar machines as his that are using MySQL Server with 2000 simultaneous connections doing 400 queries per second. (In this case the limit was the web bandwidth, not the database.)
It sounded like he was using a Linux kernel that either had some problems with many threads, such as kernels before 2.4, which had a problem with many threads on multi-CPU machines. We have documented in this manual how to fix this and Tim should be aware of this problem.
The other possible problem could have been an old glibc library and that Tim didn't use a MySQL binary from our site, which is linked with a corrected glibc library, but had compiled a version of his own. In any of these cases, the symptom would have been exactly what Tim had measured.
We asked Tim if we could get access to his data so that we could repeat the benchmark and if he could check the MySQL version on the machine to find out what was wrong and he promised to come back to us about this. He has not done that yet.
Because of this we can't put any trust in this benchmark either. :(
Over time things also change and the preceding benchmarks are not that relevant anymore. MySQL Server now has a couple of different storage engines with different speed/concurrency tradeoffs. 「7 MySQL テーブル型」節参照. It would be interesting to see how the above tests would run with the different transactional table types in MySQL Server. PostgreSQL has, of course, also got new features since the test was made. As these tests are not publicly available there is no way for us to know how the database would perform in the same tests today.
Conclusion:
The only benchmarks that exist today that anyone can download and run
against MySQL Server and PostgreSQL are the MySQL benchmarks.
We here at MySQL AB
believe that Open Source
databases should be tested with Open Source
tools!
This is the only way to ensure that no one does tests that nobody can
reproduce and use this to claim that one database is better than another.
Without knowing all the facts it's impossible to answer the claims of the
tester.
The thing we find strange is that every test we have seen about PostgreSQL, that is impossible to reproduce, claims that PostgreSQL is better in most cases while our tests, which anyone can reproduce, clearly show otherwise. With this we don't want to say that PostgreSQL isn't good at many things (it is!) or that it isn't faster than MySQL Server under certain conditions. We would just like to see a fair test where PostgreSQL performs very well, so that we could get some friendly competition going!
For more information about our benchmark suite, see 「5.1.4 The MySQL Benchmark Suite」節.
We are working on an even better benchmark suite, including multi-user tests, and a better documentation of what the individual tests really do and how to add more tests to the suite.
Go to the first, previous, next, last section, table of contents.