2011-06-22 12 views
2

インデックス作成に関する「ベストプラクティス」の質問があります。mysqlのインデックス作成の質問

私は通常、整数のためにcolumnをフォーマットしている電話番号をインデックスに登録する必要があります。番号を複数の列に分けることができます:areacode、suffix、prefix、country code。しかし、私は国際的な数字を考慮する必要があり、数字はある国ではちょっと面白くなるので、私は1つの列を保つことを好みます。

私の質問は、列データを整数、文字、またはvarcharsに保存しておきたいのですか? 私はint以外のものを取り除くので、おそらくvarcharは必要ありません。

私はクライアントの検索能力を提供しなければならないので、番号をインデックスする必要があります。 電話番号がすべて米国からのものだった場合、私は列を分けていましたが、私は国際的にもケータリングしています。

私は索引付けの部分、およびこの分野の他の人々の実践については興味があります。整数で索引付けするのが最善でしょうか?

補足として、電話番号はすべて同じ長さになるわけではありません。だから私はcharまたはvarcharの列構造体のフォーマットについて尋ねる。

ありがとうございました!

+1

私はそれが最小限のスペース要件を維持するので、それをvarcharとして保つのがより理にかなっていると思います。その後、完全な列を索引付けするか、最初の数文字だけを索引付けすることができます。しかし、私はすべての(またはほとんどすべての)エントリーに一意の電話番号が付いているので、電話番号のインデックス作成は助けにならないと思います。 – Abhay

+0

WHERE句(または結合)で電話番号を使用する場合は、特に電話番号が各行に固有の場合は、索引付けする必要があります。 – Rafe

答えて

2

テーブルはどれくらいの大きさになる予定ですか?私が尋ねる理由は、intのインデックスは小さくなるはずですが、小さなテーブルではこれは大きな考慮事項ではありません。 varcharを使用すると、より多くの柔軟性が得られます。たとえば、「415%」のような電話番号は、より大きなインデックスを使用しています。テーブルが非常に大きく、それが実行されているボックスが、索引がメモリに収まらない状況に陥る可能性があり、そのインデックスに対するクエリをスワップ地獄に送ります。これはストレージエンジンの選択によって悪化する可能性があります:InnoDBはすべてのインデックスにプライマリキー、これはあなたのPKは、広いフィールドまたはフィールド上にある場合は、あなたのインデックスを膨らますることができます。

+0

私は実際に電話番号のデータベースをいくつか持っています。私が見た中で最大のものは約5Mの数字でした。当然のことながら、数字に重複はあまり多くありませんが、エリアでは多くのareacodeとprefixが重複しています。特定の地域を検索するのに役立ちます。 – coffeemonitor

1

電話番号は#と*を含めることができますので、私は整数を使用しないことをお勧めします。
また国際プレフィックスは、これは国際的な接頭辞をサポートすることです+ですあなたがいる国にかかわらず。

南アフリカでは国番号の前に接頭語「09」が必要です。欧州では接頭辞は00です。
国際番号をどこでも使えるようにするには、+に置き換えてください。携帯電話では、これを海外ダイヤルのローカルプレフィックスに置き換えます。

私は電話番号にvarcharを使用します。

さらに、InnoDBのパフォーマンスを引き続き維持するために、整数auto_incrementを主キーとして使用し、電話番号を副キーとして使用します。
また、人々は電話番号を「共有」できるので、一意であるとは限りません。