私はBIGINTを使用して、1から増加するID番号を保持しています。1つのテーブルでは、これが主キーになり、もちろん一意になります。他のテーブルでは、外部キーになります。PACK_KEYSを設定すると、先行ゼロがたくさんあるため、このキーが「パック」されるかどうかを調べようとしています。
テーブル作成のPACK_KEYSテーブルオプションのMySQLドキュメントを理解するのに苦労しています。ドキュメントからの関連する引用は次のとおりです。
2進数キーをパックする場合、MySQLはプレフィックス圧縮を使用します。
前のキーの何バイトが次のキーと同じであるかを示すために、すべてのキーに1バイト余分に必要です。
行へのポインタは、圧縮を改善するために、キーの直後に上位バイトから順に格納されます。
これは、2つの連続する行に多数の等しいキーがある場合、後続のすべての「同じ」キーは通常2バイト(行へのポインターを含む)しか使用しないことを意味します。これを、次のキーがstorage_size_for_key + pointer_size(ポインターサイズは通常4)を取る通常の場合と比較してください。逆に、同じ番号が多数ある場合にのみ、プレフィックス圧縮から大きなメリットが得られます。すべてのキーが完全に異なる場合、キーがNULL値を持つ可能性のあるキーでない場合は、キーごとに1バイト多く使用します。(この場合、パックされたキーの長さは、キーがNULLかどうかをマークするために使用されるのと同じバイトに格納されます。)
彼らは「 2つの連続した行に多くの等しいキーがあり、それに続くすべての「同じ」キーは通常2バイトしかかかりません(行へのポインタを含む) 」で私を失いました。私が達成しようとしていることに照らして、誰かが私のために上記のドキュメントを解釈できますか?たとえば、主キーの場合、「等しいキー」はありません。2つの連続する行、3つの連続する行、100の連続しない行、またはそれらが駆動しているものは何でもです。
ありがとう!