MySQL 學習中領悟的MySQL調優策略

2021-09-25 12:32:49 字數 2509 閱讀 7866

mysql 資料庫的使用是非常的廣泛,穩定性和安全性也非常好,經歷了無數大小公司的驗證。僅能夠安裝使用是遠遠不夠的,mysql 在使用中需要進行不斷的調整引數或優化設定,才能夠發揮 mysql 的最大作用。mysql 的優化可以從個方面來做:

1、快取。快取是解決這類問題的一把手。它既可以加快整個系統(並非資料庫系統,使用快取的時候並沒有去訪問資料庫)的訪問速度,也可以減少資料庫負載的壓力。而快取一般都是在查詢中使用,我們並不希望每一次的查詢都要去訪問資料庫。那麼我們的快取做到**呢?一般情況下版的系統都會存在服務層這一結構層次,而資料訪問層一般都只是對於資料庫的增刪改查的介面的定義,所以我們的快取就需要在服務層進行。而mybatis中的一級快取,通過判斷查詢條件是否要訪問資料庫,查詢條件與某一次相同,則直接返回快取中的資料,查詢條件不同則需要訪問資料庫,並且將結果放到快取中。

2、當只需要一條資料時使用limit 1.我們作為開發者,是能夠知道我們需要的資料的條數的,若已經知道結果只有一條的時候,一定要使用limit 1 ,這樣一來,mysql在查詢到一條資料之後,會立即停止搜尋,這會帶來效能上的提公升。

3、避免select * ,取之所需。公司裡的一些同事,無論查詢什麼都是直接select *,然後再從結果中取想要的字段。這樣做的話,平白無故的給mysql帶來了不必要的負擔,因為從資料庫中讀出越多的資料,查詢就會變得越慢。所以,以後看到select * 的時候,想一下是否可以在這裡進行一些優化。

4、為每張表設定乙個id作為其主鍵。這個id最好是乙個int型別的,推薦使用unsigned,並將其設定為自動增加auto_increment。之前就出現過乙個同事將varchar的字段作為主鍵的情況, 然後在資料量較大的時候,資料庫這個環節速度變得不是很友好,所以盡量不要使用varchar來當主鍵,它會使得效能出現下降。實際上,在mysql的innodb引擎中,表是根據主鍵的順序,以索引(平衡樹的結構,非二叉樹)的形式存放的,也就是整張表變化了乙個索引。所以再不加索引的情況下,通過主鍵查詢資料比通過其他字段查詢資料快。既然主鍵是索引,就需要去進行維護了。這個可能就需要在索引樹某幾個節點的中間插入資料,或者會牽扯到資料頁的**,索引使用自增的int型別的主鍵,它是這一種追加的方式,就不會牽扯到往中間插入資料的這種情況,也不會有葉子結點的**。並且有些時候,int型別的長度比vachar小,普通索引裡面會儲存主鍵的資料,所以普通索引佔據的空間更小。

5、使用enum而不是varchar。實際上,enum儲存的是tinyint型別,但其顯示為字串。用這個欄位來作一些選項列表就變得很合適了。比如你有乙個字段,比如「性別」、「狀態」或「所屬部門」等,你知道這些欄位的值是固定且有限的,那麼可以考慮使用enum。對於性別這個字段,一般分為兩種,有可能還有保密這種情況,我們可以使用數字1、2、3來分別表示這三張情況,而對於這些數字含義的區分則是業務層的事情了。我們需要將一些繁瑣的需要計算的步驟全部放到業務層(或者說是服務層),因為系統的瓶頸在資料庫,我們不能將過多的計算過程壓到資料庫上面去。資料庫儲存的資料應該盡量簡單,但是,我們會在業務層結合具體的業務,對這些簡單的資料進行分析。

6、盡可能的使用not null。除非你有乙個很特別的原因要去使用null值,你應該總讓你的字段保持為not null。

7、選擇正確的儲存引擎。myisam適合一些需要大量查詢的應用。但其對於大量寫操作並不是很好。因為它使用到的是表級鎖,所以在你更新的時候,整張表都會被鎖起來,試想一下,當你在更新某一行資料的時候,導致其他的行都無法被訪問,這會不會 很難受呢。另外,myisam對於select count(*)這類操作的計算時很快的。而至於innodb而言,對於一些小的應用,它會比myisam還慢。它支援的是行級鎖,於是寫操作較多的時候,它會更加優秀。它還支援一些更高階的應用,比如說:事務。

8、建立合適的索引。上面說到了其實表的主鍵就是一種索引。如果某個欄位你總要拿來做搜尋條件的話,那麼為它建立索引吧。這裡的原理是,普通的字段建立了索引,索引樹的子節點其實是主鍵,也就是說搜尋的時候,先通過普通索引找到主鍵,再通過主鍵去查詢表中的資料(這個過程叫做回表)。必要的時候,我們還可以建立覆蓋索引,比如,需要通過身份證去查詢姓名的這個查詢很頻繁,我們可以建立覆蓋索引,也就是對身份證和姓名建立索引,如(idcard,name),這樣的話,在索引樹中不僅僅有對應的id,還有該行對應的name的值,此時就不需要根據id進行回表操作了。並且建立覆蓋索引時需要注意一些原則,比如我現在資料庫裡只有乙個主鍵索引,身份證姓名索引,此時我們還有乙個查詢——通過身份證查詢位址,但是這個查詢並不是很頻繁,此時需不需要建立(idcard,address)這個覆蓋索引呢?我們需要知道的是,建立索引是會佔據表的磁碟空間的,並不是沒有任何消耗的。其實這個是沒必要的,因為建立了(idcard,name)這個覆蓋索引之後,就不用再建立idcard這個索引了。建立覆蓋索引需要注意索引的順序,如果通過建立覆蓋索引可以少維護乙個索引的話,這個順序可以優先考慮。另乙個就是空間的問題了。比如(name,age)索引,name是比age要大的,索引可以考慮乙個(name,age),乙個(age)。還有一點需要知道:加了索引是會影響對於資料庫寫操作的效能的。原因是:資料庫需要維護索引樹的正確的狀態,增加資料就會改變原來的結構,這個過程會帶來效能的損耗。但是,不要以為建立索引,就可以為所欲為。其中有一些常用的規則需要去遵循以下的。建立索引規則

資料庫mysql調優實戰經驗總結

php中mysql函式 PHP中的MySQL函式

本篇主要介紹採用php語言如何連線mysql資料庫。首先需要檢測服務mysql是否開啟成功。檢視phpinfo 函式 使用php運算元據庫的步驟 一 連線資料庫伺服器 二 選擇資料庫 mysql select db 資料庫名 三 設定編碼格式 mysql set charset utf 8 四 資料...

php中mysql的使用 PHP中MySQL的使用

連線到mysql mysql connect dbc mysql connect host,user,password 選擇當前資料庫 mysql select db database name mysql select db database name conn eg mysql select d...

mysql中的prof是什麼意思 MySQL索引

索引的種類 普通索引 最基本的索引,沒有任何限制。唯一索引 索引列的值必須唯一,但允許有空值。如果是組合索引,則列值的組合必須唯一。主鍵索引 是一種特殊的唯一索引,乙個表只能有乙個主鍵,不允許有空值。建立主鍵時就自動生成了該索引。組合索引 指多個欄位上建立的索引,只有在查詢條件中使用了建立索引時的第...