SQL文の最大長 MySQL サーバーが実行出来るSQL文の最大長は、max_allowed_packetシステム変数で設定。max_allowed_packetの最大値 は1GB。max_allowed_packetの値はセッションごとにも設定可能。
データベースの個数 データベースオブジェクトの個数に制限はない。ただしOS上の制限あり。Linuxの場合、 ext2/ext3の場合は32768個まで。
データベースあたりのテーブル数 制限はない。ただしOS上の制限で実質は1万。
MySQLサーバー全体でのテーブル数 ストレージエンジンごとの制限による。例えばMySQL Clusterでは、MaxNoOfTablesというパラメーターで設定する。MaxNoOfTablesの最大値は1600。
テーブルごとのカラム数 MySQL の制限値は4096個まで。ただし、ストレージエンジンごとの制限が優先。
システム全体でのカラム数 ストレージエンジンごとの制限が適用されるが、MyISAMやInnoDBには制限はない。
MySQL ClusterではMaxNoOfAttributesパラメーターで設定することができる。MaxNoOfAttributesの最大値は2^32であ るが、システム全体で保持することができるオブジェクト(テーブル、カラム、インデックス、データベースすべてを含む)が20320個までという制限があり、そちらが適用されることになる。
テーブルごとのインデックス数 ストレージエンジンには最低16個以上のインデックスをサポートすることが定められているが、上限は定義されていない。従って、ストレージエンジンごとの制限がそのまま適用される。MyISAMは64個、InnoDBは上限なし、MySQL Clusterはカラムとインデックスを合わせて128個までである。
インデックス長 MySQL自体の制限値は3072バイト(1024 x 3)までである。それぞれストレージエンジンごとの制限が適用されるが、InnoDBは内部的には3500バイトまでサポートしているので、インデックス 長の制限値は適用されない。MyISAMは1000バイトまでである。MySQL Clusterにはインデックス長の制限はない。4.1以前のバージョンのMySQLでは1024バイトまで。
インデックスあたりのカラム数 マルチカラムインデックスを作る場合、インデックス長も気にしなければいけないが、カラム数にも制限が存在する。MyISAMの場合は16まで、InnoDBの場合は制限なし、MySQL Clusterは32までである。
行サイズ MySQL自体の上限は、64KBまでである。ただし、これにはBLOB(およびTEXT)は含まれない。BLOBは他の領域に格納されるからだ。さらに、ストレージエンジンごとに制限が存在する場合がある。

InnoDB は、テーブルスペースのページサイズの約半分で、ページサイズのデフォルトは16KBなのでデフォルトの行サイズは約8KBである。ページサイズの上限は64KBであるので、その場合の1行の最大サイズは32KBとなる。MySQL Clusterは1行あたり最大8KB。

テーブルあたりの行数 MySQL自体にはテーブルごとの行数の制限はない。ただし、PRIMARYやUNIQUEインデックスが格納できる行数には限界があるので、だいたいはそちらの制限を受けることになる。例えばPRIMARY KEYのデータ型がINTの場合は-2147483648~2147483647、INT UNSIGNEDの場合は0~4294967295までという値の範囲をとるので、4294967295行以上を格納することは出来ないわけである。
テーブルサイズ こちらもMySQL自体には制限はない。

InnoDBの場合は、テーブルスペースの最大サイズである64TBが実質の上限となる。それ以前に、64TBのファイルを作成できる必要があるのだが、ext3などのファイルシステムでは、ファイルサイズの上限が2TBなので、それより大きなテーブルを作成したい場合には、テーブルスペースを複数のファイルで構成する必要がある。

MyISAMの場合も、.MYIまたは.MYDファイルがOSまたはファイルシステムがサポートしているファイルの最大サイズの制限を受ける。Linuxの場合、ext2/ext3では2TB、ext4では16TB、XFSでは8エクサバイトまでである。SolarisではUFSの場合1TB、ZFSの場合16エクサバイトである。ただし、MyISAMはファイルサイズの他に、内部で利用しているポインタサイズによっても テーブルサイズの制限を受ける。デフォルトでは256TBまで(ただし5.0.6以前は4GBまで)のテーブルが作成可能である。ポインタサイズはCREATE TABLE実行時にMAX_ROWSおよびAVG_ROW_LENGTHオプションで指定可能である。(MAX_ROWS x AVG_ROW_LENGTHが希望するテーブルサイズ程度になるようにする。)

MySQL Clusterの場合はDataMemoryやIndexMemoryのサイズ、およびディスク型テーブルの場合はテーブルスペースのサイズが上限となる。

テンポラリテーブルサイズ テンポラリテーブルは、メモリベースのものとディスクベースのものが存在する。メモリベースのもののサイズが限界に達すると、MyISAMに変換される。変換の処理が結構重いので、変換があまり発生しないようにテンポラリテーブルのサイズやクエリをチューニングする必要がある。

メモリベースのテンポラリテーブルのサイズは、tmp_table_sizeおよびmax_heap_table_sizeオプションで設定することができる。

CHARのサイズ 255文字まで。バイトではなく文字。マルチバイト文字を使うと、1文字辺りの最大バイト数x255バイトになる。例えばUTF-8の場合、1文字あたり3バイトまで消費するのでCHAR(255)は765バイトとなるので注意しよう。MySQL 6.0では4バイトUTF-8がサポートされるので、CHAR(255)は1020バイトになる。
VARCHARのサイズ 65535文字までである。ただし、1文字の最大サイズは3バイトなので、65535文字だと軽く1行あたりの最大サイズの上限である64KBを超えてしまう。そのような場合、自動的に(MEDIUM)TEXTなどに変換される。また、スペック上はシングルバイトの文字コードだとVARCHAR(65535)まで作成できることになっているが、実際には65529~65535バイトの場合はエラーになってしまう。その場合は代わりにTEXTを使おう。
BLOB/TEXTのサイズ 通常のBLOB(TEXT)は64KBまで、TINYBLOB、MEDIUMBLOB、LONGBLOBはそれぞれ256バイト、16MB、4GBまでである。こちらはCHAR/VARCHARとは違って文字数ではなくバイト数なので気をつけよう。
INTの最大値 -2147483648~ 2147483647、INT UNSIGNEDの場合は0~4294967295まで。(4バイトだから。)TINYINTは1バイトなので-127~128、SMALLINTは2バイトだから-32768~32767、MEDIUMINTは3バイトだから-8388608~8388607、BIGINTは8バイトだから -9223372036854775808~9223372036854775807。UNSIGNEDはそれぞれ、TINYINTが255まで、 SMALLINTが65535、MEDIUMINTが16777215、BIGINTが18446744073709551615。
DECIMALの最大値 DECIMAL は最大で65桁まで定義することが可能である。小数点以下の桁数は30桁まで。従って、全体で65桁で小数点以下がない場合、つまりDECIMAL(65)は -99999999999999999999999999999999999999999999999999999999999999999~ 99999999999999999999999999999999999999999999999999999999999999999まで格納することが出来る。全体で65桁で小数点以下が30の場合、つまりDECIMAL(65,30)は -99999999999999999999999999999999999.999999999999999999999999999999~ 99999999999999999999999999999999999.999999999999999999999999999999まで格納することが出来る。

必要に応じて桁数を割り当てよう。

DATETIMEとTIMESTAMPの最大値 DATETIME は1000-01-01 00:00:00~9999-12-31 23:59:59、1970-01-01 00:00:01~2038-01-09 03:14:07(ただし時間帯はUTC)まで格納することが出来る。TIMESTAMPは2038年問題にぶち当たるわけである。
テーブルあたりのパーティション数 1024(サブパーティション含む)
カラム名、テーブル名、データベース名などの識別子 MySQL自体の制限値は64文字までである。ただしMySQL Clusterは、カラム・インデックス名は31文字まで、テーブル名とデータベース名は合わせて122文字までという制限がある。
ユーザー数 制限なし。何名でも登録可能。
ユーザー名 16文字まで。
パスワード長 制限なし。パスワードは、内部的にはPASSWORD()関数によってハッシュ値が計算され格納されるだけである。ただし、mysqlコマンドを-pオプションつきで実行した場合などに表示されるパスワードの入力を求めるプロンプトに対しては、80文字まで。
同時接続数 max_connections パラメーターで調整可能。max_connectionsオプションの最大値は100000(MySQL 5.1.17以降)である。ただし、MySQLは一つのコネクションに対して一つのスレッドを作成する仕様になっている。そのため、OSが作成出来るスレッド数(プロセスあたり/システム全体)によって制限される。OSが作成することができるスレッド数は、システム起動時に自動的に調整されたり、スタック領域のサイズによって制限される場合が多い。

また、コネクションごとにOSがTCP/IPソケットを一つ作成するが、その度にファイルディスクリプタを一つ消費する。従って、一つのプロセスが同時に開くことができるファイル数にも制限を受けることになる。(下記、同時にオープンできるテーブル数参照)

同時実行クエリ数 制限なし。接続している全てのセッションがクエリを実行することができる。ただし、ロックの競合などが発生して待たされる場合が多々あるので、真に同時に(内部的に)実行されるクエリ数はもっと少ない。

また、ストレージエンジンには同時に実行出来るトランザクション数に限界があるので、そちらの制限に引っかかるだろう。InnoDBの場合は1023トランザクションまで、MySQL ClusterはMaxNoOfConcurrentTransactionsパラメーターで調整できる。 MaxNoOfConcurrentTransactionsの最大値は2^32弱である。

同時にオープンできるテーブル数 MySQL自体には制限はなく、ストレージエンジンごとに制限が存在する。

MyISAM の場合、テーブルをセッションが開く度にファイルディスクリプタを消費する。.MYIは全てのセッションで共有されるが、.MYDはセッションごとに一つのファイルディスクリプタが必要になる。従って、多くのファイル、多くの接続を同時に使用する場合には、同時にオープンできるファイル数を増やさなければ ならない。同時にopenできるファイル数は、open_files_limitパラメーターで設定することができ、内部的には setrlimit(ulimitコマンド相当のシステムコール)で調整することができるが、カーネルがさらに上限値を持っていることが多い。Linuxの場合は、sys.fs.file-maxカーネルパラメーターで、Solarisの場合はrlim_fd_max、rlim_fd_curカーネルパラメーターで調整する。

InnoDBは、デフォルトではテーブルスペースを共有しているのでこのような制限はない。ただしinnodb_files_per_tableオプションを使用している場合は同様に一つのプロセスが開くことができるファイル数に制限を受けることになる。

JOINできるテーブル数 61
サブクエリのネスト数 31回まで。(最外部クエリを合わせると全体で32。)
テーブルに設定出来るトリガ数 それぞれBEFORE/AFTERとINSERT/UPDATE/DELETEの組み合わせで6つまで。同じ種類のトリガを重複して設定することは出来ない。
利用可能CPU数 利用可能なCPUコア数/ソケット数などに制限はない。また、商用版のライセンス形態もCPU数ではなくサーバー単位である。ただし、CPUが利用可能なことといくつまでスケールするかは別の話。スケーラビリティを重視している人はMySQL 5.4を使おう。
同時に起動できるMySQLサーバーインスタンス数 データディレクトリやTCP/IPポート番号、UNIXソケット、PIDファイルなどの資源が被らなければいくつでも起動可能。ただし、OSに依存する。
利用可能メモリ量 32ビット版のOSの場合は2GB~3GBの制限がある。LinuxやSolarisでは3GBまで、Windowsの場合はデフォルトでは2GBまで。