2016-03-22 7 views
1

この奇妙な状況を考えてみましょう。
インデックスの冗長性があります。MySQL:なぜvarcharフィールドの代わりにintにジョインすることをお勧めしますか?

TableA (item_id, code_key, data01, ... data0n) 
TableB (item_id, code_key, dataA1, ... dataAn) 

item_idとcode_keyの両方が一意であり、両方のテーブルのプライマリキーである可能性があります。 item_idまたはcode_keyは、参照/関係を失うことなく、両方のテーブルから削除できます。

私は知っていますが、これは質問のポイントではありません。 両方の列が索引付けされているとします。

Item_idはINTで、codeKeyはVARCHAR(100)です。

select * from TableA INNER JOIN TableB USING(item_id) 

いうより:

select * from TableA INNER JOIN TableB USING(code_key) 

両方の列がインデックス化され、パフォーマンスが同じになるので、私はそれのポイントが表示されていない

誰かがそれがより良いクエリだ示唆されます。 ... ではない?

INTを持つのは、ON句にVARCHARを置いたほうが速いでしょうか?両方とも索引付けされていてもですか?

+0

[SQLでの文字列比較とint結合のパフォーマンス]の重複(http://stackoverflow.com/questions/12431107/performance-of-string-comparison-vs-int-join-in-sql) – sagi

+0

Performancewise、非常に大きなデータセットを除いて、その差はごくわずかです。主な要因は、特定の状況下でコードキーが変更できるかどうかです。 – Strawberry

+0

あなたのコメントは、他の質問とは逆に、私が思ったものと一致しています。 Code_keyが挿入され、item_idのように変更されることはありません。私はシーンの背後にあるMysqlがこれらの列を索引付けしていると考えています。その宣言型にもかかわらず、検索や結合などの操作で同じパフォーマンスベンチマークヒットとなります。 – koalaok

答えて

2

int比較は、varcharよりもはるかに少ない領域を占めるという単純な理由から、varchar比較よりも高速です。

これは、索引付けされていないアクセスと索引付きのアクセスの両方に当てはまります。 への最速の方法は、インデックス付きのint列です。

- @Robertムンテアヌ

お役に立てば幸いです。それほど大きな違いはありませんが、スピード性能を重視しています。 varcharが長くなるほど遅くなります。

0

同じ情報に対して2つの列があることを尋ねているようです。それはほとんどいつも眉をひそめている。上を移動する...あなたはINTVARCHARを持つべき

...ローをフェッチする

は、個々の列を行うには何よりも(キャッシュされていても)もっと多くの費用がかかります。したがって、VARCHARINTよりも高価かもしれませんが、その理由のために変更を行うためにあなたの道を去ることを保証するには、それほど高価ではありません。

同様の議論は、式の複雑さにもなります。関連する静脈において

ENUM代わりにVARCHAR適切を使用する複数の理由があります。 (TINYINTVARCHARを変更するための同上。)

  • 小規模 - >速く、I/Oバウンド場合は特に。
  • インデックスを作成すると、インデックスも小さくなります。
  • 少ないディスクスペース

「ノーマライゼーション」INTのいくつかの大きさによってVARCHARを交換する意図的な試みです。しかし、それには複数の理由があります。

  • 文字列を変更する場所は1つで、多くの表の行は多くありません。この理由が存在する場合は、他の考慮事項よりも優先されます。
  • 省スペース。
  • しかし、複雑さが増しています(現在はJOINが必要です)。したがって、速度が改善されてもよいし、改善されなくてもよい。

INTをピッキングするときは、常に最小の味を選んでください。 INTは4バイトをとります。 MEDIUMINT - 3バイトなど。範囲に基づいて選択します。通常はUNSIGNEDを使用してください。

関連する問題