web-dev-qa-db-ja.com

SQL SELECT速度intとvarchar

私はテーブルを作成中です。

Make(fx BMW、Audi ect。)のある車を格納すると、makeをintまたはvarcharとして格納すると、クエリ速度に違いが生じます。

そうです

SELECT * FROM table WHERE make = 5 AND ...;

より速い/遅い

SELECT * FROM table WHERE make = 'audi' AND ...;

または、速度はほぼ同じですか?

95
googletorp

Int比較はvarchar比較よりも高速です。これは、intがvarcharよりもはるかに少ないスペースしか占有しないという単純な事実のためです。

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


質問postgreqlにタグを付けたように、さまざまな日付タイプのスペース使用量に興味があるかもしれません。

91
Robert Munteanu

いくつかの大まかなベンチマーク:

Postgres 9.xの400万件のレコード

Table A = base table with some columns
Table B = Table A + extra column id of type bigint with random numbers
Table C = Table A + extra column id of type text with random 16-char ASCII strings

8GB RAM、i7、SSDラップトップでの結果:

Size on disk:                A=261MB        B=292MB        C=322MB
Non-indexed by id: select count(*), select by id: 450ms same on all tables
Insert* one row per TX:       B=9ms/record        C=9ms/record
Bulk insert* in single TX:    B=140usec/record    C=180usec/record
Indexed by id, select by id:  B=about 200us       C=about 200us

* inserts to the table already containing 4M records

したがって、この設定のように見えます。インデックスがRAMに収まる限り、bigintと16文字のテキストでは速度に違いはありません。

27

Varcharの代わりにintを使用すると、少し速くなります。速度にとってより重要なのは、レコードを検索するためにクエリが使用できるフィールドにインデックスを付けることです。

Intを使用するもう1つの理由は、データベースを正規化することです。テキスト「Mercedes-Benz」をテーブルに数千回保存する代わりに、IDを保存し、ブランド名を別のテーブルに1回保存する必要があります。

18
Guffa

文字列比較と非浮動小数点の実際のパフォーマンスの内訳、この場合、サイズに関係なく、符号なしと符号付きは関係ありません。サイズは実際にはパフォーマンスの真の違いです。 1バイト+(最大126バイト)対1、2、4、または8バイトの比較...非フロートは明らかに文字列やフロートよりも小さいため、アセンブリでよりCPUフレンドリーです。

all言語での文字列と文字列の比較は、CPUによる1命令で比較できるものよりも低速です。 32ビットCPUで8バイト(64ビット)を比較しても、VARCHAR(2)以上の場合よりも高速です。 *繰り返しますが、生成されたアセンブリを(手動でも)見てください。1バイトから8バイトのCPU数値よりも文字ごとに比較するのに多くの命令が必要です。

さて、どれくらい速くなりましたか?データ量にも依存します。 5を「audi」と単純に比較しているだけで、DBがそれだけである場合、結果として生じる差は非常に小さいので、それを目にすることはありません。 CPU、実装(クライアント/サーバー、Web /スクリプトなど)に応じて、DBサーバーで数百回の比較に達するまで(おそらく目立って数千回の比較に達するまで)、おそらく表示されません。

  • ハッシュ比較に関する誤った論争を無効にするため。ほとんどのハッシュアルゴリズム自体は低速であるため、CRC64以下のようなものの恩恵を受けません。 12年以上にわたり、複数の国の検索エンジン用の検索アルゴリズムを開発し、信用調査機関用に7年間開発しました。数字で保持できるものはすべて高速です。たとえば、電話番号、郵便番号、通貨* 1000(ストレージ)、通貨div 1000(取得)は、比較のためにDECIMALよりも高速です。

オズ

8
Ozz Nixon

インデックスの有無にかかわらず、intははるかに高速です(varcharが長いほど、遅くなります)。

別の理由:varcharフィールドのインデックスはintよりもはるかに大きくなります。大きなテーブルの場合、数百メガバイト(および数千ページ)を意味する場合があります。インデックスの読み取りだけで多くのディスク読み取りが必要になるため、パフォーマンスが大幅に低下します。

6
Konrad Garus

一般に、intはより高速です。 varcharが長いほど遅くなります

4
anthares

ヒント:フィールドの可能な値makenever(またはめったに)変更されない場合、妥協案としてENUMを使用できます。優れた速度と読みやすさを兼ね備えています。

3
Thomas Schaub

いずれかのフィールドでindexingをオンにすると、高速になります。あなたの質問に関しては、intvarcharより速いと思います。

1
Sarfraz

やや相対的。はい、INTはより高速になりますが、問題はそれがあなたの状況で顕著かどうかです。 VARCHARは小さな単語ですか、それとも長いテキストですか?また、テーブルにはいくつの行がありますか?数行しかない場合は、メモリに完全にバッファリングされる可能性が高くなります(頻繁に要求される場合)。その場合、大きな違いに気付くことはありません。その後、もちろんインデックスがあります。これは、テーブルが大きくなるとより重要になります。 SSDを使用すると、クエリが最適化されたHDよりも高速になる場合があります。また、優れたディスクコントローラーは10xを超えるクエリを高速化することがあります。これにより、VARCHARを使用するだけのスペースができ、クエリの読み取りと書き込みが簡単になり(複雑な結合を作成する必要がなくなり)、開発がスピードアップします。しかし、純粋主義者は反対し、常にすべてを正常化します。

0
Alex