標籤:大量 from 聯合 mysql 關鍵字 最佳化 sel 獨立 name
1) 最佳化表的資料類型
表需要使用何種資料類型是需要根據應用來判斷的。雖然應用設計的時候需要考慮欄位的長度留有一些冗餘,但是不推薦讓很多欄位都留有大量的冗餘,這樣既浪費磁碟儲存空間,同時在應用程式操作時也浪費實體記憶體。
在 MySQL 中,可以使用函數 PROCEDURE ANALYSE() 對當前應用的表進行分析,該函數可以對資料表中列的資料類型提出最佳化建議,使用者可以根據應用的實際情況酌情考慮是否實施最佳化。
以下是函數 PROCEDURE ANALYSE() 的使用方法:
SELECT * FROM tbl_name PROCEDURE ANALYSE();
SELECT * FROM tbl_name PROCEDURE ANALYSE(16, 256);
輸出的每一列資訊都會對資料表中的列的資料類型提出最佳化建議。以上第二句告訴 PROCEDURE ANALYSE() 不要為那些包含的值多於 16 個或者 256 個位元組的 ENUM 類型提出建議。
2) 通過拆分提高表的訪問效率
這裡所說的拆分,是指對資料表進行拆分。如果針對 MyISAM 類型的表進行,那麼有兩種拆分方法。
2.1> 垂直分割
把主碼和一些列放到一個表,然後把主碼和另外的列放到另一個表中。
如果一個表中某些列常用,而另一些列不常用,則可以採用垂直分割,另外,垂直分割可以使得資料行變小,一個資料頁就能存放更多的資料,在查詢時就會減少 I/O 次數。其缺點是需要管理冗餘列,查詢所有資料需要聯合(JOIN)操作。
2.2> 水平分割
根據一列或多列資料的值把資料行放到兩個獨立的表中。水平分割通常在以下幾種情況下使用。
表很大,分割後可以降低在查詢時需要讀的資料和索引的頁數,同時也降低了索引的層數,提高查詢速度。
表中的資料本來就有獨立性,例如,表中分別記錄各個地區的資料或不同時期的資料,特別是有些資料常用,而另外一些資料不常用。
需要把資料存放到多個介質上。
水平分割會給應用增加複雜度,它通常在查詢時需要多個表名,查詢所有資料需要 UNION 操作。在許多資料庫應用中,這種複雜性會超過它帶來的優點,因為只要索引關鍵字不大,則在索引用於查詢時,表中增加 2~3 倍資料量,查詢時也就增加讀一個索引層的磁碟次數,所以水平分割要考慮資料量的增長速度,根據實際情況決定是否需要對錶進行水平分割。
MySQL--最佳化資料庫物件