goo*_*orp 102 sql postgresql performance select
我正在创建一张桌子,这让我很奇怪.
如果我存储,比如拥有制造商的汽车(fx宝马,奥迪等),如果我将制造商存储为int或varchar,它会对查询速度产生任何影响.
也是
SELECT * FROM table WHERE make = 5 AND ...;
Run Code Online (Sandbox Code Playgroud)
更快/更慢
SELECT * FROM table WHERE make = 'audi' AND ...;
Run Code Online (Sandbox Code Playgroud)
或者速度会或多或少相同?
Rob*_*anu 93
Int比较比varchar比较更快,因为简单的事实是int占用的空间比varchars少得多.
对于无索引和索引访问,这都适用.最快的方法是索引的int列.
我看到你已经标记了postgreql的问题,你可能会对不同日期类型的空间使用感兴趣:
int字段占用2到8个字节,其中4个通常绰绰有余(-2147483648到+2147483647)Grz*_*ywo 32
一些粗略的基准:
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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
所以它看起来像这个设置,只要你的索引适合RAM,bigint vs 16-char文本在速度上没有区别.
Guf*_*ffa 18
使用int而不是varchar会更快一些.对速度更重要的是在字段上有一个索引,查询可以使用该索引来查找记录.
使用int还有另一个原因,那就是规范化数据库.您应该存储它的ID并将品牌名称存储在一个单独的表中,而不是将"梅赛德斯 - 奔驰"文本存储在表格中数千次.
分解为字符串比较与非浮点数的实际性能,在这种情况下,任何未签名和签名的大小都无关紧要.大小实际上是性能的真正差异.无论是1byte +(最多126字节)还是1,2,4或8字节比较......显然非浮动小于字符串和浮点数,因此在组装时更加CPU友好.
所有语言中的字符串到字符串比较都比CPU在1条指令中可以比较的要慢.即使比较32位CPU上的8字节(64位)仍然比VARCHAR(2)或更大.*再次,查看生成的程序集(甚至是手工),它需要更多的指令来比较char by char而不是1到8字节的CPU数字.
现在,快多少?还取决于数据量.如果您只是简单地将5与'audi'进行比较 - 这就是您的所有数据库所具有的,那么产生的差异是如此之小,您将永远不会看到它.根据CPU,实现(客户端/服务器,Web /脚本等),您可能不会看到它,直到您在数据库服务器上进行几百次比较(甚至可能在显着之前进行几千次比较).
OZZ
是否索引,int快很多(varchar越长,它变慢)。
另一个原因:varchar字段上的索引将比int上的索引大得多。对于较大的表,可能意味着数百兆字节(和数千页)。由于仅读取索引需要大量磁盘读取,因此这会使性能变得更差。