SQL SELECT speed int vs varchar

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的问题,你可能会对不同日期类型的空间使用感兴趣:

  • 你指的是第7.4页.在现代版本中,如果你有<126字节,它们占用1byte + length.还要注意,字符串慢得多的原因通常是校对敏感的比较非常昂贵 - 而不是字符串占用更多空间.但最终的结果当然是一样的. (11认同)
  • “int 比较比 varchar 比较快,因为 int 占用的空间比 varchar 少得多这一简单事实” - 这不是真的_一般_。根据您使用的 DBMS 以及您想要插入的确切数据类型和字符串,结果可能是您的(比如)8 字节整数比保存一些平均长度为 3-4 个字符的文本 ID 的 ascii varchars 长。所以,这个答案 - 不精确并且缺乏任何特定的背景或实验结果 - 并没有真正回答这个问题。每个人都知道 varchar _允许_比 int 占用更多的空间,但他们不必这样做。 (3认同)
  • 您能在这里支持您关于索引访问的主张吗?我在网上看到的每个基准都说 varchar 与 int 对于索引访问是相同的,并且您没有发布任何数据或参考来支持您的主张。/sf/answers/3400827111/ (2认同)

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文本在速度上没有区别.

  • 很有意思。差异为何可忽略不计? (4认同)

Guf*_*ffa 18

使用int而不是varchar会更快一些.对速度更重要的是在字段上有一个索引,查询可以使用该索引来查找记录.

使用int还有另一个原因,那就是规范化数据库.您应该存储它的ID并将品牌名称存储在一个单独的表中,而不是将"梅赛德斯 - 奔驰"文本存储在表格中数千次.

  • @ user2118559:是的,这就是你存储它的方式.要获取数据,通常使用连接而不是子查询:`从main_table c中选择一些内部连接car_brands b b.Id = c.Brands其中b.Brands ='Mercedes-Benz'. (3认同)
  • 为什么投反对票?如果你不解释你认为错误的地方,就无法改善答案。 (2认同)

Ozz*_*xon 8

分解为字符串比较与非浮点数的实际性能,在这种情况下,任何未签名和签名的大小都无关紧要.大小实际上是性能的真正差异.无论是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


Kon*_*rus 6

是否索引,int快很多(varchar越长,它变慢)。

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

  • 例如,有5百万条“ audi”记录,索引是否仅包含“ audi”字符串的一个副本和5百万个primary_key整数?大小差异真的会那么大吗,是vchar还是integer? (3认同)

ant*_*res 5

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