2014-03-29 48 views
0

我需要将值设置为"Yes or No"列名称STATUS。我正在考虑2种方法。MySQL - 按数字或字母查询?

方法1(使用字母):设定值Y/N然后发现,由像一个查询有在字段STATUSY所有行:

SELECT * FROM post WHERE status="Y" 

方法2(使用次数):设定值1/0然后找到所有行,通过像查询在字段STATUS1

SELECT * FROM post WHERE status=1 

我应该使用方法1或方法2?哪一个更快?哪一个更好?

+0

请勿使用它们中的任何一个,因为它们在语义上都不正确,状态不能为Yes或No.例如,如果您需要知道帖子是否已发布,请使用is_published作为布尔值。 – Peter

+1

@Peter。 。 。其实,如果这是目的,那就根本不要使用旗帜。只要保留'PublishedDate'并检查它是否为'NULL'。 –

回答

1

这两者基本上是等价的,所以这成为您的应用程序更适合的问题。

如果您关心的是空间,那么一个字符的最小空间是char(1),使用8位。使用数字,您可以使用位或设置类型来打包多个标志。但是,如果你有很多标志,这只会有所作为。

商店,它作为一种数方法有微弱的优势,在那里你可以通过执行数“是”值:

select sum(status) 

(当然,在MySQL中,这仅仅是一个如果你决定要包括“也许”或其他值在未来的某一时刻对sum(status = 'Y')略有改善。

商店,它作为一种字母的方法有微弱的优势。

最后,有什么区别在表现这些价值观的不同方式表现是将会非常非常小。您需要一张拥有数百万行数百万行的表格才能开始注意到问题。因此,请使用最适合您的应用程序的机制和表示值的方式。

0

最快的方法是;

SELECT * FROM post WHERE `status` = FIND_IN_SET(`status`,'y');  

我想你应该ENUM('n','y')创建列。 Mysql以最佳方式存储这种类型。它也将帮助您在该字段中仅存储允许的值。

您还可以使其更加人性化ENUM('不','是'),而不影响性能。由于每个ENUM定义只存储一次字符串“no”和“yes”。 Mysql只存储每行值的索引。

0

第二个速度明显加快,主要是因为无论什么时候引用某些内容,对SQL来说都没有意义。为了获得更好的性能,最好使用非字符串类型。我会建议使用方法2.

0

我认为方法1更好,如果你关心存储的前景。 由于存储一个整数,即1/2占用4个字节的内存,因为一个字符只占用1个字节的内存。所以最好使用方法1. 这可能会增加一些性能。