Mysql 字符串和int-cloumn(表设计)的性能真的不同吗?
我对这个问题感兴趣。每次我设计一张桌子,我都有这样的疑问。以表posts为例,它包含一个名为post_type的列,该列可以是以下值之一: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
- post(varchar)或1(tinyint)
- 第页(varchar)或第2页(tinyint)
- 修订版(varchar)或3(tinyint)
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
列)。另一方面,如果使用字符串,则会引入人为键入错误。我更喜欢我的变量对我大喊大叫,说我打错了。一根绳子根本不在乎这个。