2009-07-21 5 views
3

Funny thing私はabount mysqlを見つけました。 MySQLには、3バイトの数値型(MEDIUMINT)があります。その範囲は-8388608から8388607です。私にとっては奇妙に思えます。パフォーマンスを向上させるために数値型のサイズを選択したので、データは機械語またはダブルワードに揃えてください。また、数値範囲にいくつかの制限ルールが必要な場合は、データ型に対して相対的でなければなりません。例:mysql(MEDIUMINT)の3バイトの意味

CREATE TABLE ... (
    id INT RANGE(0, 500) PRIMARY KEY 
) 

だから、誰でも3バイトを知っていますか?何か理由はありますか?

+0

興味深い質問 - あなたは私のupvoteを手に入れました。 – M4N

+0

なぜdownvote? O_o –

答えて

2

上記の調整問題は、主にRAMのデータに適用されます。 MySQLは、そのタイプを処理する際にそのタイプを格納するために3バイトを使用する必要はありません。

これは、ディスクキャッシュをより効率的に使用する上で、小さな利点があります。

+0

はい、現代のプロセッサには3バイトのデータを操作するための命令がありません。 3バイトの数字の合計をとると、プロセッサは2つの4バイトの数字をゼロの高い上位バイトで合計します。これは正しいです? 3バイトの数字に表示される唯一の利点は、スペースです。大きなデータセットでは、3-bteの数値は25%小さくなります。 –

+0

はい、そうです。私は通常、そのデータ型を使用しません;) –

9

なぜなら、3バイトの範囲内の数値を持つ場合、4バイトを使用して格納することでスペースを無駄にしないからです。

200億行がある場合は重要です。

+0

スペースはデータベース操作で非常に重要です。 – hobodave

+0

これは元の質問のポイントであった配置問題には答えません。 – Svante

+0

Mehrdadは次のように答えました。私が話している目的のためにアラインメントは重要ではありません。 – chaos

2

我々は、非常に大きなスペース節約として、tinyint,smallint、およびmediumintを頻繁に使用します。覚えておいて、それはあなたのインデックスをはるかに小さくします。

id1 smallint unsigned not null, 
id2 mediumint unsigned not null, 
primary key (id1, id2) 

そしてあなたは、レコードの何百万、数百または数十億を持っている:あなたのような、本当に小さな参加のテーブルを持っているとき

この効果は拡大しています。

+1

プロセッサは3バイトの数値を比較できません。したがって、メモリインデックスには、各インデックス位置に4バイトを含める必要があります。あなたはmediumintを使用している場合、インデックスのサイズが3バイトであることを確認していますか? –