一、概述
資料庫優化,主要包括資料表設計、索引、sql語句、表拆分、資料庫伺服器架構等方向的優化。
二、資料庫設計
在建表的時候,就需要考慮到將來的使用場景,盡量在建表初期就設計好。
1、儲存引擎
mysql常被提到的儲存引擎就是innodb和mysiam,其實現在主要都在用innodb了。兩者的區別:
innodb支援事務,索引和資料存在乙個檔案,主鍵查詢速度快(主鍵就是索引b+樹的葉子節點,而資料就繫結在葉子節點),行級鎖,支援外來鍵,恢復起來較快。
mysiam不支援事務,支援全文索引,表級鎖, 索引和資料檔案分開存放。
innodb在眾多方面都優於mysiam,且mysiam的全文索引其實可以使用其他工具來實現,故常用innodb引擎。
另外,如果兩個表的引擎不一樣,乙個是mysiam另乙個是innodb,則事務的恢復只會恢復innodb的表,這樣的事務並不完整,故要求所有的表都是innodb。
2、字段
1)字串
定長的字串用char比較好,這樣修改的時候不會產生碎片,而且利用率高。相對來說,varchar則用於長度不一致的字段。
2)列舉
對於只有幾種值的字段,用列舉的效果更好。表示狀態的字段,常常可以這麼設計。列舉在mysql底層,會轉成int儲存,效率很高。另外,儲存的時候,建議不要直接用1、2這種,可以用英文來表示不同的狀態,比較好辨認。
3)數字
不需要負數的時候,可以加上unsigned;需要精確的小數才考慮decimal。
三、索引
索引可以加快查詢速度,但是對於增刪改,還需要去維護對應的b+樹,因此索引是按需設定,不能亂加。
innodb的索引,分為主鍵索引和輔助索引。
1、主鍵索引
innodb的主鍵索引,是和資料繫結在一起的,因此按照主鍵來查詢時,找到值的時候,也就找到了對應的資料,所以說innodb的主鍵索引查詢速度特別快。
如下圖所示:
另外可以看到,innodb引擎下,資料是繫結在主鍵的,故innodb引擎的表,必須要設定主鍵。
另外,建議設定逐漸增大的數字作為主鍵,且不要修改主鍵,這樣避免主鍵的b+樹旋轉太多。
2、輔助索引
除了主鍵,其他的索引統稱為輔助索引。其他的索引,是用其他的b+樹來儲存,子節點上存的是這一行對應的主鍵的資訊。
故用輔助索引查詢,找到對應的主鍵後,還需要去主鍵的b+樹上查詢,才可以找到對應的資料。
3、聯合索引
當多個字段共同組成索引,則成為聯合索引。聯合索引需要遵循最左字首原則。例如建立聯合索引a_b_c。
下列語句是可以用到索引的:
select * from *** where a = 『xx』 and b = 『xx』 and c = 『xx』;
select * from *** where a = 『xx』 and b = 『xx』;
select * from *** where a = 『xx』;
select * from *** where a = 『xx』 and b = 『xx』 and c > 『xx』;
select * from *** where a = 『xx』 and b > 『xx』;
select * from *** where a > 『xx』;
下列語句是用不到索引的:
select * from *** where b = 『xx』 and c = 『xx』;
select * from *** where a > 『xx』 and b = 『xx』 and c = 『xx』;
需要說明的是,前面乙個字段用到的大於,則後面的字段無法用到索引。因為聯合索引的儲存是多個b+樹的連線;1個字段的葉子節點接下乙個欄位的根節點。故如果出現大於,則後面的字段無法確定範圍,即無法使用到索引。
4、唯一索引
唯一索引是輔助索引的一種,除了索引的功能,還能保證欄位在資料庫中是唯一的,這對於併發新增有防止重複的作用。
5、建索引注意事項
1)對於where、order by、group by,都可以考慮建索引。
2)索引建立在區分度大的字段上,對於性別這類的字段,建立索引沒有意義。
3)對於字串型別,可以考慮建立字首索引,例如對於description欄位的前7個字元建立索引,語句為:alter table xxtable add key (description(7));
四、sql語句優化
1、盡量用到索引
1)避免在 where 子句中對字段進行 null 值、!=或<>、in 和 not in 、非打頭字母like搜尋、表示式操作或者函式操作,這些操作都會導致放棄索引,全表掃瞄。
2)or,左右兩邊都應該對索引的列進行查詢,只要有一邊的列不是索引列,就會導致放棄使用索引。可以考慮用union代替or,這樣至少可以有一部分資料用到索引。
3)對於字串型別,如果裡面存的是數字,查詢的時候也要記得加上引號,強制轉成字串,這樣才能用到索引。
2、其他查詢優化
1)如果不需要全量資料,可以考慮用limit。
2)避免用子查詢,mysql的子查詢,內部執行計畫器是這樣執行的:先查外表再匹配內錶,而不是先查內錶,當外表的資料很大時,查詢速度會非常慢。
3)對於group by,mysql對所有group by col1,col2...的字段進行排序。如果查詢包括group by,想要避免排序結果的消耗,則可以指定order by null禁止排序。
五、表拆分
對於資料量太大的表,可以考慮拆分表,以減少掃瞄的資料量。
1、橫向拆表
當資料量太大,且資料有一定的規律,則可以橫向分表。例如交易明細表,可以根據使用者id進行分表,把使用者id進行hash,不同的hash結果對應到不同的表,再編寫乙個實現演算法,根據id到對應的表進行增刪改查即可。
2、縱向拆表
3、分割槽
分割槽是mysql自帶的功能,其原理是將乙個表的資料存在不同的檔案中,由mysql根據內部規則,自動去對應的資料檔案找資料。
六、資料庫伺服器架構
1、讀寫分離
商業應用上,資料庫經常都是讀寫分離的,通常寫在主庫,讀在從庫進行。資料庫的主從一致性,是通過中繼日誌實現的。
每當有資料修改,主庫會將sql語句寫入中繼日誌,然後從庫會把日誌搬到對應的從庫日誌,再逐條執行sql。
2、負載均衡
負載均衡,可以通過mycat等外掛程式實現,可以理解為資料庫是對底層儲存檔案的抽象,而mycat是對資料庫的抽象。
載入頁面訪問速度 優化
一 優化 即使在現在,網路頻寬有了很多的提高,56k貓逐漸淡出,優化以加快網頁速度還是很有必要的。優化包括減少數 降低影象質量 使用恰當的格式。2 降低影象質量 如果不是很必要,嘗試降低影象的質量,尤其是jpg格式,降低5 的質量看起來變化不是很大,但檔案大小的變化是比較大的。二 影象格式的選擇 1...
資料庫訪問優化法則
從圖上可以看到基本上每種裝置都有兩個指標 延時 響應時間 表示硬體的突發處理能力 頻寬 吞吐量 代表硬體持續處理能力。從上圖可以看出,計算機系統硬體效能從高到代依次為 cpu cache l1 l2 l3 記憶體 ssd硬碟 網路 硬碟 根據資料庫知識,我們可以列出每種硬體主要的工作內容 cpu及記...
訪問資料庫優化法則
減少資料訪問 減少磁碟訪問 建立並正確使用索引 只通過索引訪問資料 優化sql執行計畫 返回更少的資料 減少網路傳輸 資料分頁處理 a 應用程式分頁 客戶端或瀏覽器 a 應用伺服器分頁 客戶端或瀏覽器 a 資料庫sql分頁 客戶端或瀏覽器 只返回需要的字段 減少互動次數 減少網路傳輸 使用儲存過程 ...