Mysql 字符串和int-cloumn(表设计)的性能真的不同吗?

Mysql 字符串和int-cloumn(表设计)的性能真的不同吗?,mysql,database-performance,sqldatatypes,Mysql,Database Performance,Sqldatatypes,我对这个问题感兴趣。每次我设计一张桌子,我都有这样的疑问。以表posts为例,它包含一个名为post_type的列,该列可以是以下值之一: post(varchar)或1(tinyint) 第页(varchar)或第2页(tinyint) 修订版(varchar)或3(tinyint) 问题是我应该为该列使用什么类型varchar使查询结果更加直观,我不需要弄清楚1/2/3是什么意思 至于tinyint,它的性能是否比varchar好 PS:我使用的是MySQL。如果你打算将它们用作数字,T

我对这个问题感兴趣。每次我设计一张桌子,我都有这样的疑问。以表posts为例,它包含一个名为post_type的列,该列可以是以下值之一:

  • post(varchar)或1(tinyint)
  • 第页(varchar)或第2页(tinyint)
  • 修订版(varchar)或3(tinyint)
问题是我应该为该列使用什么类型varchar使查询结果更加直观,我不需要弄清楚1/2/3是什么意思

至于tinyint,它的性能是否比varchar好


PS:我使用的是MySQL。

如果你打算将它们用作数字,
TINYINT(1)
肯定更好,因为MySQL不需要做不必要的转换。对于
1字符
字符串,可以使用
CHAR(1)
ENUM

数据类型没有性能。它们是一种存储格式

查询确实有性能。因此,为了评估性能,您应该明确您要测量的查询

在仅通过主键获取行的查询中,没有实际区别。InnoDB将给定行的列保存在一个页面上,因此一旦它将页面从磁盘提取到RAM中,所有列都可用。整数读取4字节与字符串(如“修订版”)读取8字节之间的差异微不足道

SELECT post_type FROM posts WHERE post_id = 8675309;
如果您是通过行的
post\u类型
值来查找行,那么它就变得更重要了,因为它需要进行一些比较来评估每一行,看看是否应该包含在结果中。根据行数以及是否有索引,字符串比较和整数比较之间的差异可能很重要

SELECT ... FROM posts WHERE post_type = 'revision';
我创建了一个表,并在其中填充了超过100万行:

create table posts (
  post_id serial primary key, 
  post_type_utf varchar(10), 
  post_type_bin varbinary(10), 
  post_type_int int
);
然后我计算了搜索整个表所需的时间:

select count(*) from posts where post_type_utf = 'revision';
+----------+
| count(*) |
+----------+
|  1048576 |
+----------+
1 row in set (0.24 sec)

mysql> select count(*) from posts where post_type_bin = binary 'revision';
+----------+
| count(*) |
+----------+
|  1048576 |
+----------+
1 row in set (0.15 sec)

mysql> select count(*) from posts where post_type_int = 1;
+----------+
| count(*) |
+----------+
|  1048576 |
+----------+
1 row in set (0.15 sec)
时间表明,搜索整数与搜索二进制字符串大致相同

为什么utf8字符串速度较慢?因为每个字符串比较都必须根据为列定义的排序规则逐字符求值。二进制字符串比较只能使用
memcmp()
在一次操作中比较整个字符串

同样重要的是,考虑到索引通常比你选择的数据类型更大的性能因素。索引有帮助,因为对特定post_类型值的查询将只检查匹配的行


但在这种情况下,post_类型只有几个不同的值,因此索引中的搜索可能会匹配许多行。

从性能角度看,这并不重要。出于您提到的原因,请使用
varchar
方法(甚至可以使用
ENUM
列)。另一方面,如果使用字符串,则会引入人为键入错误。我更喜欢我的变量对我大喊大叫,说我打错了。一根绳子根本不在乎这个。