2017-03-24 10 views
0

したがって、同じオブジェクトを参照するIDを持つ2つのテーブルがあります。それらのテーブルの1つはvarcharとして格納し、もう1つはintとして格納します。私はこれらの2つのテーブルをサブクエリ(または可能であれば)結合します。MySQLで比較するとintにvarcharまたはvarcharに変換する方が速いですか?

WHERE foo = CAST(bar AS UNSIGNED) 

または

WHERE CAST(foo AS CHAR) = bar 

より良いものですか?

編集:いずれのIDもインデックスに登録されていません。

+0

なぜあなたはそれらをキャストする必要があると思いますか? –

+0

@PaulSpiegel彼らはとにかく暗黙にキャストされます。 – Psi

+0

@Psi私は知っています。だから私は尋ねる。明示的にキャストしない場合、MySQLは、使用するインデックスに応じてキャストする方法を選択できます。 –

答えて

1

インデックスによって異なります。両方の列にインデックスが設定されている場合は、4バイトを比較するだけでよいため、intにキャストする必要があります。ただし、varchar列のみがインデックスに登録されている場合は、varcharにキャストしてください。

最後に、使用するインデックスを確認し、それに応じてキャストするクエリexplainが必要です。

インデックスが設定されていない場合は、intにキャストする方が一般的には優れた方法です。しかし、インデックスが設定されていない場合は、実際には関係ありません。キャストする正しい方法を選択するよりも、インデックスを作成するほうがずっと多くの時間を節約できます。表を除いて、表は小さいです。それでは、どちらも問題ではありません。実際に

、我々は考慮に比較のために、だけでなく、鋳造するためのコストだけではなくを取る必要があります:varcharintをキャストすると、intvarcharを解析するよりも若干速いです。ただし、4文字以上のvarcharを比較すると、その利点は役に立たなくなります。値が999を超える傾向がある場合は、intへのキャストが高速になります。しかし、それはあなたのオペレーティングシステム、アーキテクチャ、あなたのmysqlバイナリで使用される命令セットなどに依存します。本当に信頼できる答えを得る唯一の方法は、ターゲットマシンの状況をベンチマークすることです。

+0

どちらのIDもインデックスに登録されていませんが、varcharをintにキャストすることをおすすめしますか? –

+0

この場合、本当に言いにくいです。それはさまざまな要因に依存します。たとえテーブル内の異なる値の分布であっても問題はありません。 – Psi

+2

索引付けされていない列に参加しているときのパフォーマンスについて話すと、車をプッシュまたはプルする必要があるかどうか尋ねるのが好きです。 - ) –

関連する問題