效能優化(optimize)指的是在保證系統正確性的前提下,能夠更快速響應請求的一種手段。而且有些效能問題,比如慢查詢等,如果積累到一定的程度或者是遇到急速上公升的併發請求之後,會導致嚴重的後果,輕則造成服務繁忙,重則導致應用不可用。它對我們來說就像一顆即將被引爆的定時炸彈一樣,時刻威脅著我們。因此在上線專案之前需要嚴格的把關,以確保 mysql 能夠以最優的狀態進行執行。
mysql 的優化方案有哪些?
mysql 資料庫常見的優化手段分為三個層面:sql 和索引優化、資料庫結構優化、系統硬體優化等,然而每個大的方向中又包含多個小的優化點,下面我們具體來看看。
優化注意事項:
優化目標
優化方案一: sql 和索引優化
以上這些優化方案我們都可以通過explain方式來驗證。
explain各個欄位詳介紹:
type字段值如下:優化方案二:資料庫結構優化
①最小資料長度
一般說來資料庫的表越小,那麼它的查詢速度就越快,因此為了提高表的效率,應該將表的字段設定的盡可能小,比如身份證號,可以設定為 char(18) 就不要設定為 varchar(18)。
②使用最簡單資料型別
能使用 int 型別就不要使用 varchar 型別,因為 int 型別比 varchar 型別的查詢效率更高。
③盡量少定義 text 型別
text 型別的查詢效率很低,如果必須要使用 text 定義字段,可以把此字段分離成子表,需要查詢此字段時使用聯合查詢,這樣可以提高主表的查詢效率。
④選擇合適的儲存引擎
儲存引擎型別:myisam、innodb、memory、merge、tokudb、csv、archive等。
myisam:如果應用是以讀操作和插入操作為主,只有很少的更新和刪除操作,並且對事務的完整性、併發性要求不是很高,那麼選擇該儲存引擎是非常合適的。myisam是在web、資料倉儲和其他應用環境下最常使用的儲存引擎之一。
innodb:用於事務處理應用程式,支援外來鍵。如果應用程式對事務的完整性有比較高的要求,在併發條件下要求資料的一致性,資料操作除了插入和查詢外,還包括很多的更新、刪除操作,那麼innodb儲存引擎是比較合適的選擇。innodb儲存引擎除了有效地降低由於刪除和更新導致地鎖定,還可以確保事務地完整提交(commit)和回滾(rollback),對於類似計費系統或者財務系統等對資料準確性要求較高地系統,innodb都是合適地選擇。
memory:將所有資料儲存在ram中,在需要快速定位記錄和其他類似資料的環境下,可提供極快的訪問。memory的缺陷是對錶的大小有限制,太大的表無法快取在記憶體中,其次是要確保表的資料可以恢復,資料庫異常終止後表中的資料是可以恢復的。memory表通常用於更新不太頻繁的小表,用以快速訪問結果。
三種常見的儲存引擎對比:
⑤適當分表、分庫策略分表和分庫方案也是我們經常說的垂直分隔(分表)和水平分隔(分庫)。
分表是指當一張表中的字段更多時,可以嘗試將一張大表拆分為多張子表,把使用比較高頻的主資訊放入主表中,其他的放入子表,這樣我們大部分查詢只需要查詢欄位更少的主表就可以完成了,從而有效的提高了查詢的效率。
分庫是指將乙個資料庫分為多個資料庫。比如我們把乙個資料庫拆分為了多個資料庫,乙個主資料庫用於寫入和修改資料,其他的用於同步主資料並提供給客戶端查詢,這樣就把乙個庫的讀和寫的壓力,分攤給了多個庫,從而提高了資料庫整體的執行效率。
優化方案三: 系統硬體優化
mysql 對硬體的要求主要體現在三個方面:磁碟、網路和記憶體。
①磁碟
磁碟尋道能力(磁碟i/o),以目前高轉速scsi硬碟(7200轉/秒)為例,這種硬碟理論上每秒尋道7200次,這是物理特性決定的,沒有辦法改變;磁碟應該盡量使用有高效能讀寫能力的磁碟,比如固態硬碟,這樣就可以減少 i/o 執行的時間,從而提高了 mysql 整體的執行效率。
磁碟也可以盡量使用多個小磁碟而不是乙個大磁碟,因為磁碟的轉速是固定的,有多個小磁碟就相當於擁有多個並行執行的磁碟一樣。
②網路
保證網路寬頻的通暢(低延遲)以及夠大的網路頻寬是 mysql 正常執行的基本條件,如果條件允許的話也可以設定多個網絡卡,以提高網路高峰期 mysql 伺服器的執行效率。
dns配置 盡量使用skip-name-resolve來減少因解析帶來的不必要麻煩。
檢查網路的ping 丟包率。
通過優化/etc/sysctl.cnf 中的網路引數,提公升效能。
③記憶體
mysql 伺服器的記憶體越大,那麼儲存和快取的資訊也就越多,而記憶體的效能是非常高的,從而提高了整個 mysql 的執行效率。
知識擴充套件:
慢查詢:慢查詢通常的排查手段是先使用慢查詢日誌功能,查詢出比較慢的 sql 語句,然後再通過 explain 來查詢 sql 語句的執行計畫,最後分析並定位出問題的根源,再進行處理(上文中有介紹到)。
慢查詢日誌指的是在 mysql 中可以通過配置來開啟慢查詢日誌的記錄功能,超過 long_query_time 值的 sql 將會被記錄在日誌中。我們可以通過設定「slow_query_log=1」來開啟慢查詢,它的開啟方式有兩種:
通過 mysql 命令列的模式進行開啟,只需要執行「set global slow_query_log=1」即可,然而這種配置模式再重啟 mysql 服務之後就會失效;
另一種方式可通過修改 mysql 配置檔案的方式進行開啟,我們需要配置 my.cnf中的「slow_query_log=1」即可,並且可以通過設定「slow_query_log_file=/tmp/mysql_slow.log」來配置慢查詢日誌的儲存目錄,但這種方式配置完成之後需要重啟 mysql 伺服器才可生效。
需要注意的是,在開啟慢日誌功能之後,會對 mysql 的效能造成一定的影響,因此在生產環境中要慎用此功能。
Mysql的優化方案
1 避免放棄使用索引而進行全表掃瞄的情況 在where後的條件中盡量不使用 2 正確的使用索引 3 正確選擇exist 與 in 和 not exist 與 not in 在任何情況下 not exist 的效率都高於 not in 4 使用join來替代子查詢 子查詢 通過select語句來建立乙...
Mysql優化方案
client 客戶端編碼方式,最好和服務端儲存一致 loose default character set utf8 mysqld 埠port 3306 mysql根目錄 basedir d ide mysql 5.6.25 winx64 資料檔案存放目錄 datadir d ide mysql 5...
MySQL優化方案
select 和select 欄位的優化。我們先測試一下,我的測試資料庫裡有26萬條記錄。再查詢一下列數 select count from information schema.columns where table schema lezhi data and table name demo jo...