SQL SELECT speed int vs varchar

时间:2010-02-27 10:02:54

标签: sql performance postgresql select

我正在创建一张桌子,这让我很奇怪。

如果我存储,比如拥有制造商的汽车(如宝马,奥迪等),如果我将制造商存储为int或varchar,它会对查询速度产生任何影响。

所以

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

更快/更慢
SELECT * FROM table WHERE make = 'audi' AND ...;

或速度或多或少相同?

9 个答案:

答案 0 :(得分:88)

Int比较比varchar比较更快,因为ints占用的空间比varchars少得多。

对于无索引和索引访问都适用。最快的方法是索引的int列。


正如我看到你标记了postgreql的问题,你可能会对不同日期类型的空间使用感兴趣:

答案 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 /脚本等),您可能不会看到它,直到您在数据库服务器上进行几百次比较(甚至可能在显着之前进行几千次比较)。

  • 取消有关哈希比较的错误争议。大多数散列算法本身都很慢,所以你不会受益于像CRC64这样的东西。 12年多来,我为多县搜索引擎开发了搜索算法,为信用局开发了7年。任何你可以保持数字更快的...例如电话号码,邮政编码,甚至货币* 1000(存储)货币div 1000(检索)比DECIMAL更快进行比较。

Ozz

答案 4 :(得分:5)

索引与否,int快得多(varchar越长,得到的越慢)。

另一个原因:varchar字段的索引将比int大得多。对于较大的表,它可能意味着数百兆字节(和数千页)。这使得性能更差,因为单独读取索引需要许多磁盘读取。

答案 5 :(得分:4)

一般来说,int会更快。 varchar越长越慢

答案 6 :(得分:3)

提示:如果字段 make 的可能值将从不(或很少)更改,则可以使用ENUM作为折衷方案。它结合了良好的速度和良好的可读性。

答案 7 :(得分:1)

如果您在其中一个字段上启用索引,则会更快。至于你的问题,我认为intvarchar快。

答案 8 :(得分:0)

有点相对。 是的,INT会更快,但问题是你的情况是否明显。 VARCHAR只是一些小词或更长的文本吗?表格中有多少行?如果只有几行,它很可能完全缓存在内存中(经常要求),在这种情况下你不会注意到很多不同。然后当然有索引,当表增长时它变得更加重要。使用SSD可能比使用优化查询的HD更快。同样好的磁盘控制器有时会加快查询速度> 10倍。这可能只留下使用VARCHAR的空间,这使得读取和编写查询更容易(无需编写复杂的连接)并加快开发速度。 然而,纯粹主义者会不同意并始终将一切正常化。

相关问题