我正在创建一张桌子,这让我很奇怪。
如果我存储,比如拥有制造商的汽车(如宝马,奥迪等),如果我将制造商存储为int或varchar,它会对查询速度产生任何影响。
所以
SELECT * FROM table WHERE make = 5 AND ...;
比
更快/更慢SELECT * FROM table WHERE make = 'audi' AND ...;
或速度或多或少相同?
答案 0 :(得分:88)
Int比较比varchar比较更快,因为ints占用的空间比varchars少得多。
对于无索引和索引访问都适用。最快的方法是索引的int列。
正如我看到你标记了postgreql的问题,你可能会对不同日期类型的空间使用感兴趣:
int
字段占用between 2 and 8 bytes,其中4通常绰绰有余(-2147483648至+2147483647)答案 1 :(得分:25)
一些粗略的基准:
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 vs 16-char文本就没有速度差异。
答案 2 :(得分:17)
使用int而不是varchar会更快一些。对速度更重要的是在字段上有一个索引,查询可以用它来查找记录。
使用int还有另一个原因,那就是规范化数据库。您应该存储它的ID并将品牌名称存储在一个单独的表中,而不是将“梅赛德斯 - 奔驰”文本存储在表格中数千次。
答案 3 :(得分:6)
分解字符串比较与非浮点数的实际性能,在这种情况下,任何未签名和签名的大小都无关紧要。大小实际上是性能的真正差异。无论是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
答案 4 :(得分:5)
索引与否,int快得多(varchar越长,得到的越慢)。
另一个原因:varchar字段的索引将比int大得多。对于较大的表,它可能意味着数百兆字节(和数千页)。这使得性能更差,因为单独读取索引需要许多磁盘读取。
答案 5 :(得分:4)
一般来说,int会更快。 varchar越长越慢
答案 6 :(得分:3)
提示:如果字段 make 的可能值将从不(或很少)更改,则可以使用ENUM作为折衷方案。它结合了良好的速度和良好的可读性。
答案 7 :(得分:1)
如果您在其中一个字段上启用索引,则会更快。至于你的问题,我认为int
比varchar
快。
答案 8 :(得分:0)
有点相对。 是的,INT会更快,但问题是你的情况是否明显。 VARCHAR只是一些小词或更长的文本吗?表格中有多少行?如果只有几行,它很可能完全缓存在内存中(经常要求),在这种情况下你不会注意到很多不同。然后当然有索引,当表增长时它变得更加重要。使用SSD可能比使用优化查询的HD更快。同样好的磁盘控制器有时会加快查询速度> 10倍。这可能只留下使用VARCHAR的空间,这使得读取和编写查询更容易(无需编写复杂的连接)并加快开发速度。 然而,纯粹主义者会不同意并始终将一切正常化。