MySQL查詢優化系列之資料型別與效率

2021-08-20 04:55:09 字數 1778 閱讀 9651

這一部分提供了如何選擇資料型別來幫助提高查詢執行速度的一些指導:

如果你可以選擇資料行的儲存格式,那麼應該使用最適合儲存引擎的那種。對於myisam資料表,最好使用固定長度的資料列代替可變長度的資料列。例如,讓所有的字元列用char型別代替varchar型別。權衡得失,我們會發現資料表使用了更多的磁碟空間,但是如果你能夠提供額外的空間,那麼固定長度的資料行被處理的速度比可變長度的資料行要快一些。對於那些被頻繁修改的表來說,這一點尤其突出,因為在那些情況下,效能更容易受到磁碟碎片的影響。

· 在使用可變長度的資料行的時候,由於記錄長度不同,在多次執行刪除和更新操作之後,資料表的碎片要多一些。你必須使用optimize table來定期維護其效能。固定長度的資料行沒有這個問題。

· 如果出現資料表崩潰的情況,那麼資料行長度固定的表更容易重新構造。使用固定長度資料行的時候,每個記錄的開始位置都可以被檢測到,因為這些位置都是固定記錄長度的倍數,但是使用可變長度資料行的時候就不一定了。這不是與查詢處理的效能相關的問題,但是它一定能夠加快資料表的修復速度。

儘管把myisam資料表轉換成使用固定長度的資料列可以提高效能,但是你首先需要考慮下面一些問題:

· 固定長度的資料列速度較快,但是占用的空間也較大。char(n)列的每個值(即使是空值)通常佔n個字元,這是因為把它儲存到資料表中的時候,會在值的後面新增空格。varchar(n)列占有的空間較小,因為只需要分配必要的字元個數用於儲存值,加上一兩個位元組來儲存值的長度。因此,在char和varchar列之間進行選擇的時候,實際上是時間與空間的對比。如果速度是主要的考慮因素,那麼就使用char資料列獲取固定長度列的效能優勢。如果空間很重要,那麼就使用varchar資料列。總而言之,你可以認為固定長度的資料行可以提高效能,雖然它占用了更大的空間。但是對於某些特殊的應用程式,你可能希望使用兩種方式來實現某個資料表,然後執行測試來決定哪種情況符合應用程式的需求。 

· 即使願意使用固定長度型別,有時候你也沒有辦法使用。例如,長於255個字元的字串就無法使用固定長度型別。

memory資料表目前都使用固定長度的資料行儲存,因此無論使用char或varchar列都沒有關係。兩者都是作為char型別處理的。

對於innodb資料表,內部的行儲存格式沒有區分固定長度和可變長度列(所有資料行都使用指向資料列值的頭指標),因此在本質上,使用固定長度的char列不一定比使用可變長度varchar列簡單。因而,主要的效能因素是資料行使用的儲存總量。由於char平均占用的空間多於varchar,因此使用varchar來最小化需要處理的資料行的儲存總量和磁碟i/o是比較好的。

對於bdb資料表,無論使用固定長度或可變長度的資料列,差別都不大。兩種方法你都可用試一下,執行一些實驗測試來檢測是否存在明顯的差別。

把資料列定義成不能為空(not null)。這會使處理速度更快,需要的儲存更少。它有時候還簡化了查詢,因為在某些情況下你不需要檢查值的null屬性。

考慮使用enum資料列。如果你擁有的某個資料列的基數很低(包含的不同的值數量有限),那麼可以考慮把它轉換為enum列。enum值可以被更快地處理,因為它們在內部表現為數值。

使用procedure analyse()。執行procedure analyse()可以看到資料表中列的情況:

select * from tbl_name procedure analyse();

select * from tbl_name procedure analyse(16,256); 

輸出的每一列資訊都會對資料表中的列的資料型別提出優化建議。第二個例子告訴procedure analyse()不要為那些包含的值多於16個或者256位元組的enum型別提出建議。如果沒有這樣的限制,輸出資訊可能很長;enum定義通常很難閱讀。

mysql系列之 模糊查詢

1,表示任意0個或多個字元。可匹配任意型別和長度的字元,有些情況下若是中文,請使用兩個百分號 表示。比如 select from user where u name like 三 將會把u name為 張三 張貓三 三腳貓 唐三藏 等等有 三 的記錄全找出來。另外,如果需要找出u name中既有 三...

mysql 索引優化器 Mysql之查詢優化器

對於乙個sql語句,查詢優化器先看是不是能轉換成join,再將join進行優化 優化分為 1.條件優化 2.計算全表掃瞄成本 3.找出所有能用到的索引 4.針對每個索引計算不同的訪問方式的成本 5.選出成本最小的索引以及訪問方式 開啟查詢優化器日誌 開啟 set optimizer trace en...

MySQL查詢優化之COUNT

count 聚合函式,以及如何優化使用了該函式的查詢,很可能是mysql中最容易被誤解的前10個話題之一,在網上隨便搜尋一下就能看到很多錯誤的理解,可能比我們想象的多得多。在做優化之前,先來看看count 函式的真正作用是什麼。count 的作用 count 的另外乙個作用是統計結果集的行數。當my...