我需要将值设置为"Yes or No"
列名称STATUS
。我正在考虑两种方法。
方法1(使用字母):设置值Y/N
,然后通过以下查询查找字段Y
中值STATUS
的所有行:
SELECT * FROM post WHERE status="Y"
方法2(使用数字):设置值1/0
然后通过以下查询查找字段1
中值STATUS
的所有行:
SELECT * FROM post WHERE status=1
我应该使用方法1还是方法2?哪一个更快?哪一个更好?
答案 0 :(得分:1)
这两者基本上是等价的,所以这成为一个对你的应用更好的问题。
如果您担心空间,那么一个字符的最小空间为char(1)
,使用8位。使用数字,您可以使用bit或set类型来打包多个标志。但是,如果你有很多旗帜,这只会产生影响。
以商店为对象的方法略有优势,您可以计算"是"通过这样做的价值:
select sum(status)
(当然,在MySQL中,这只是对sum(status = 'Y')
的一个微小改进。
如果您决定包含"可能"那么以字母为单位的商店方法会略有优势。或者将来某个时候的其他价值观。
最后,表示这些值的不同方式的性能差异将非常非常小。您需要一个包含数百万行的表来开始注意到问题。因此,请使用最适合您的应用程序的机制以及表示值的方法。
答案 1 :(得分:0)
最快的方式是;
SELECT * FROM post WHERE `status` = FIND_IN_SET(`status`,'y');
我认为您应该使用ENUM('n','y')
创建列。 Mysql以最佳方式存储此类型。它还可以帮助您在字段中仅存储允许的值。
您还可以使其更加人性化ENUM(' no',#39;是')而不会影响性能。因为字符串' no'和'是'每个ENUM定义仅存储一次。 Mysql只存储每行值的索引。
答案 2 :(得分:0)
第二个肯定更快,主要是因为每当你在引号内涉及某些内容时,它对SQL来说毫无意义。最好使用非字符串类型以获得更好的性能。我建议使用方法2。
答案 3 :(得分:0)
我认为如果您关注存储预期,方法1会更好。 因为存储一个整数,即1/2,需要4个字节的内存,而字符只占用1个字节的内存。所以最好使用方法1。 这可能会提高一些性能。