2014-03-29 80 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. 這可能會增加一些性能。