インデックス フィールド、およびハードディスク/RAM 上のスペース トークンに最適なものは何ですか? Biginteger または Varchar(15) ? たとえば、次のようなインデックス番号を使用できます。
from 10000001 to 45281229703 and higher...
しかし、何を選ぶのが良いですか?また、非インデックス フィールドでは、どのフィールド タイプが優れていますか?
BIGINT
は常に 8 バイトでVARCHAR(15)
あり、値の長さに応じて 1..16 バイトであるためBIGINT
、大きい数値では必要なメモリが少なくて済みますが、小さい数値 (7 桁未満) ではより多くのメモリが必要です。また、BIGINT の方が高速です。
シミュレーション環境でテストを実行しました。
上記の手順を実行するスクリプトは次のとおりです。
Create table r5(mob bigint,m_mob varchar(30));
Create index i_d on r5(mob,m_mob);
do $$
begin
for i in 1..3000000 loop
insert into r5(mob,m_mob) values(i,i||’abc’);
end loop;
end; $$
select * from r5
where mob=2900000;
select * from r5
where m_mob=’2900000abc’;
varchar はオーバーヘッドを追加します:
文字列の長さは、フィールドごとに格納する必要があり (MySQL では追加の 2 バイト IIRC)、インデックスでは比較の照合のためにさらに多くの処理が必要です。