我正在创建表格,这让我感到奇怪。
如果我存储有品牌的汽车(例如宝马,奥迪等),如果将品牌存储为int或varchar会对查询速度产生任何影响。
也是
SELECT * FROM table WHERE make = 5 AND ...;
快/慢于
SELECT * FROM table WHERE make = 'audi' AND ...;
还是速度会大致相同?
我正在创建表格,这让我感到奇怪。
如果我存储有品牌的汽车(例如宝马,奥迪等),如果将品牌存储为int或varchar会对查询速度产生任何影响。
也是
SELECT * FROM table WHERE make = 5 AND ...;
快/慢于
SELECT * FROM table WHERE make = 'audi' AND ...;
还是速度会大致相同?
Answers:
Int比较比varchar比较快,原因很简单,因为Int比varchars占用更少的空间。
对于未建立索引的访问和建立索引的访问都适用。最快的方法是建立索引的int列。
正如我看到的那样,您已经标记了问题postgreql,您可能会对不同日期类型的空间使用感兴趣:
int
字段占用2到8个字节,通常4 个字节绰绰有余(-2147483648至+2147483647)一些粗略的基准测试:
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与16个字符的文本在速度上就没有区别。
使用int而不是varchar会更快一些。对于速度而言,更重要的是在查询可用于查找记录的字段上具有索引。
使用int的另一个原因是对数据库进行规范化。与其将文本“ Mercedes-Benz”存储在表中数千次,不如存储其ID和将品牌名称存储在单独的表中一次。
Mercedes-Benz
要存储数千次id 1
?例如表car_brands
,列Brands
和Id
。行Mercedes-Benz
和1
。并在主表中列Brands
和值1
。当SELECT
,然后在第一个拿到Id
表car_brands
后SELECT Something FROM main_table WHERE Brands = (SELECT Id FROM car_brands WHERE Brands = Mercedes-Benz)
。还是其他方法?
select something from main_table c inner join car_brands b on b.Id = c.Brands where b.Brands = 'Mercedes-Benz'
。
细分为字符串比较和非浮点数的实际性能,在这种情况下,无符号和有符号的任何大小都没有关系。尺寸实际上是性能上的真正差异。与1、2、4或8字节比较相比,它是1字节+(最多126字节)...显然,非浮点型比字符串和浮点型小,因此在组装时对CPU更友好。
所有语言中的字符串到字符串比较都比CPU可以在1条指令中进行比较的速度慢。即使在32位CPU上比较8字节(64位),也仍然比VARCHAR(2)或更大的速度更快。*同样,查看生成的程序集(即使是手工),也需要更多的指令来比较一个字符到一个字符,而不是1到8字节的CPU数字。
现在,快多少?也取决于数据量。如果您只是将5与“ audi”进行比较-这就是您的数据库所拥有的全部,那么产生的差异是如此之小,您将永远看不到它。根据CPU,实现(客户端/服务器,Web /脚本等)的不同,您可能要等到您在数据库服务器上进行几百次比较(可能甚至只有几千次比较才能看到)时,才能看到它。
奥兹
提示:如果该字段的可能值化妆将永远不会(或很少)改变,你可以使用ENUM作为妥协。它结合了良好的速度和良好的可读性。
enum
数据类型?我虽然是MySQL特有的。