1

私は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の連続しない行、またはそれらが駆動しているものは何でもです。

ありがとう!

4

1 に答える 1

1

PACK_KEYSは必要ない可能性があります。PKにBIGINTを使用しているようです。最終的にこのテーブルに何行あるかを見ていますか?どのようなデータを保存していますか?どのようにそれについて取得/報告するつもりですか、そしてどのくらいの頻度で?? これらは、この機能を使用する前に私が最初に検討することです。

そのドキュメントを正しく読んだ場合、基本的に、長いPKを持つ2つの連続したレコードがある場合は次のようになります。

PK-x:1002350025789001 PK-y:1002350025789002

PACK_KEYSを使用すると、PK-yは「[PK-xへのポインタ]2」のようになります。

これは基本的に、PK-2はPK-1と同じであるという言い方ですが、最後の番号が2である点が異なります...同じ修正/前の番号を書き直したり、保存したりする必要はありません。

これによるメリットは、非常に長いPKを処理している場合にのみ実現される可能性が高く、ほとんどの場合、ストレージ/メモリのメリットになりますが、全体的なパフォーマンスにはコストがかかると思います。アクセス負荷の量によっては、目立つ場合と目立たない場合があります。そのテーブルは取得します。

それだけの価値はないかもしれません...私はこの機能を使用したことがなく、MySQLでかなり重いアプリを作成しました。

お役に立てれば。

幸運を

于 2012-12-13T22:46:29.410 に答える