このページは機械翻訳したものです。
このセクションでは、最新バージョンの MySQL の既知の問題を一覧表示します。
プラットフォーム固有の問題の詳細は、セクション2.1「一般的なインストールガイド」 および セクション5.9「MySQL のデバッグ」 のインストールおよびデバッグの手順を参照してください。
次の問題は既知の問題です。
INのサブクエリーの最適化は、=ほど効果はありません。lower_case_table_names=2(データベース名およびテーブル名に大文字/小文字のどちらが使用されたかを MySQL が認識するようになります) を使用していても、MySQL が関数DATABASE()のデータベース名、またはさまざまなログ内 (大文字/小文字が区別されないシステムの) で使用された表記を識別できません。FOREIGN KEY制約の削除はレプリケーションでは機能しません。これは、制約がレプリカ上に別の名前を持つ可能性があるためです。REPLACE(およびREPLACEオプションを指定したLOAD DATA) でON DELETE CASCADEがトリガーされません。DISTINCTリストに指定されたすべてのカラムのみを使用しない場合、GROUP_CONCAT()内でORDER BYを指定したDISTINCTが動作しません。数値は符号付き整数コンテキストで評価されるため、小数カラムまたは文字列カラムに大きい整数値 (263 から 264−1) を挿入すると、負の値として挿入されます。
-
ステートメントベースのバイナリロギングでは、ソースサーバーは実行されたクエリーをバイナリログに書き込みます。 これは、ほとんどの場合に理想的に動作する非常に高速かつコンパクトで効率的なロギング方法です。 ただし、データ変更が非決定的に行われるようにクエリーが設計されている場合は、ソースとレプリカのデータが異なる可能性があります (通常、レプリケーションの外部であっても推奨されません)。
例:
ゼロ値または
NULL値をAUTO_INCREMENTカラムに挿入するCREATE TABLE ... SELECTステートメントまたはINSERT ... SELECTステートメント。ON DELETE CASCADEプロパティーが指定された外部キーを持つテーブルから行を削除する場合のDELETE。挿入されるデータに重複キー値がある場合の
REPLACE ... SELECT、INSERT IGNORE ... SELECT。
これは、前述したクエリーに決定性順序を保証する
ORDER BY句がない場合にのみ発生することがあります。たとえば、
ORDER BYを使用しないINSERT ... SELECTの場合、SELECTは、ソースおよびレプリカでのオプティマイザによる選択に応じて、異なる順序で行を返すことがあります (これにより、行のランクが異なるため、AUTO_INCREMENTカラムで異なる番号が取得されます)。クエリーは、次の場合にのみ、ソースとレプリカで異なる方法で最適化されます:
テーブルは、レプリカとは異なるストレージエンジンを使用してソースに格納されます。 (ソースとレプリカで異なるストレージエンジンを使用できます。 たとえば、ソースでは
InnoDBを使用できますが、レプリカに使用可能なディスク領域が少ない場合はレプリカでMyISAMを使用できます。)MySQL バッファサイズ (
key_buffer_sizeなど) は、ソースとレプリカで異なります。ソースとレプリカは異なる MySQL バージョンを実行し、オプティマイザコードはこれらのバージョン間で異なります。
この問題は、mysqlbinlog|mysql を使用したデータベースのリストアに影響することもあります。
この問題を回避するもっとも簡単な方法は、行が常に同じ順序で格納または変更されるように、
ORDER BY句を前述の非決定性クエリーに追加することです。 行ベースのロギング形式または混合したロギング形式を使用することでも、この問題が回避されます。 スタートアップオプションにファイル名を指定しない場合、ログファイル名はサーバーのホスト名に基づいています。 ホスト名を別の名前に変更した場合に同じログファイル名のままにするには、
--log-bin=などのオプションを明示的に使用する必要があります。 セクション5.1.7「サーバーコマンドオプション」を参照してください。 または、ホスト名の変更が反映されるように、古いファイルを名前変更します。 バイナリログの場合は、バイナリログのインデックスファイルを編集して、そこにあるバイナリログファイル名も修正する必要があります。 (レプリカ上のリレーログにも同じことが当てはまります。)old_host_name-binmysqlbinlog では、
LOAD DATAステートメントの後に残っている一時ファイルは削除されません。 セクション4.6.8「mysqlbinlog — バイナリログファイルを処理するためのユーティリティー」を参照してください。RENAMEがTEMPORARYテーブル、またはMERGEテーブルで使用されているテーブルで動作しません。SET CHARACTER SETを使用したときに、データベース、テーブル、およびカラムの名前に変換された文字を使用できません。MySQL 8.0.17 より前は、
LIKE ... ESCAPEでESCAPEとともに_または%を使用することはできません。サーバーは、データ値を比較するときに最初の
max_sort_lengthバイトのみを使用します。 つまり、値が最初のmax_sort_lengthバイトの後にのみ異なる場合、GROUP BY、ORDER BYまたはDISTINCTで値を確実に使用することはできません。 これを回避するには、変数値を増やします。max_sort_lengthのデフォルト値は 1024 であり、サーバーの起動時または実行時に変更できます。数値計算は
BIGINTまたはDOUBLE(通常、どちらも長さは 64 ビットです) で行われます。 返される精度は関数によって異なります。 一般的なルールとしては、ビット関数はBIGINTの精度、IF()とELT()はBIGINTまたはDOUBLEの精度、および残りはDOUBLEの精度で実行されます。 符号なしの long long 値がビットフィールド以外で 63 ビット (9223372036854775807) を超える値に解決される場合は、使用しないようにしてください。1 つのテーブルには、最大 255 個の
ENUMカラムおよびSETカラムを作成できます。現在、
MIN()、MAX()、およびその他の集約関数では、MySQL はセット内の文字列の相対位置ではなく文字列値でENUMカラムおよびSETカラムを比較します。-
UPDATEステートメントでは、カラムは左から右に更新されます。 更新されたカラムを参照している場合は、元の値ではなく更新された値が取得されます。 たとえば、次のステートメントではKEYに1ではなく2がインクリメントされます。mysql> UPDATE tbl_name SET KEY=KEY+1,KEY=KEY+1; -
同じクエリーで複数の一時テーブルを参照することはできますが、特定の一時テーブルを複数回参照することはできません。 たとえば、次のステートメントは動作しません。
mysql> SELECT * FROM temp_table, temp_table AS t2; ERROR 1137: Can't reopen table: 'temp_table' -
結合で「隠し」カラムを使用している場合は、オプティマイザでの
DISTINCTの処理が異なることがあります。 結合では、隠しカラムは結果の一部としてカウントされますが (表示されていなくても)、通常のクエリーでは、隠しカラムはDISTINCT比較で考慮されません。次に例を示します。
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;2 番目のケースでは、結果セットに同一の行が 2 つ表示される場合があります (非表示の
idカラムの値が異なる可能性があるため)。これは、結果に
ORDER BYのカラムがないクエリーでのみ発生します。 空のセットを返すクエリーに関する
PROCEDUREを実行すると、PROCEDUREでカラムが変換されないことがあります。MERGEタイプのテーブルの作成で、基礎テーブルが互換性のあるタイプであるかどうかがチェックされません。ALTER TABLEを使用して、MERGEテーブルで使用されるテーブルにUNIQUEインデックスを追加し、次にMERGEテーブルに通常のインデックスを追加したときに、テーブルに古いUNIQUEではないキーがあった場合、それらのテーブルのキー順序は異なります。 これは、重複キーをできるだけ早く検出できるように、ALTER TABLEが通常のインデックスよりUNIQUEインデックスを優先するためです。