2011-08-02 8 views
1

の主キー(複合キー)を1つのBIGINTプライマリキーに「パックする」と効率的ですか?それはmySQL内で自動的に行うことができますか?それともクライアント(PHP、C++)で行う必要がありますか?「INT」主キーを1つの「LONG」にパック

私は、mySQL内でユーザーIDを相互に(例えば、友だち検索者用に)接続する方向性グラフを作成しています。

パッカーのようなものに見えるかもしれませんので、MySQLは、8バイトのBIGINT sおよび4バイトのINT秒をサポートしています。大きな男の子(FB、LI)がそれを行うにはどうすればよい

id_edge = ((BIGINT)id_from)*pow(2,31) + ((BIGINT)id_to) 

を?

CREATE TABLE `things`.`connections` (
`id_edge` BIGINT NOT NULL AUTO_INCREMENT COMMENT 'Need a single pk for gii\n' , 
`id_from` INT NOT NULL , 
`id_to` INT NOT NULL , 
.... 

答えて

4

いいえストレージをマイクロ最適化しようとしないでください。各列に1つのデータを格納する必要があります。

提案したパッキングを実装した場合、インデックス作成を不可能にすることができます。たとえば、完全なテーブルスキャンが必要です。 19.


に等しいid_toを持つすべての行はまた、さまざまなストレージエンジンについて説明しChapter 13 of the MySQL manual、そしてどのように彼らは実際に店舗テーブルのデータを読み取ることができます。

+0

"各列に1つのデータを格納する必要があります - それ以上のことはありません*" - 例外は、['SET'型](http://dev.mysql.com/doc/refman/5.1 /en/set.html)。 – binaryLV

1

まず、ビット演算子以外でそれを行う場合、それは決して効率的になりません。

//assuming int is 4 bytes 
$combined = ($a << 32) | $b 

さらに、この場合でもオーバーヘッドに値するものではありません。

第二には、int型の大きさは、私は、MySQLがすでにストレージ用に最適化だと思い、64ビットシステムで32ビットの4バイト、8つのバイトなどの異なるシステムに

異なっています。あなたのために無料で何かをしないでください。

シンプルさを追求したり、エラーがコードに入り込んでしまいます。

関連する問題