1. 程式人生 > >MySQLl優化【附帶優化視訊教程全套】

MySQLl優化【附帶優化視訊教程全套】

可以從以下幾個方面對MySQL進行優化, 
效果: SQL和索引 > 資料庫表結構 > 系統配置 > 硬體 
但成本從低到高。

1.SQL和索引優化

1.1SQL

1.1.1優化SQL語句的一般步驟:

①通過show status 命令瞭解各種SQL的執行效率,

show [session | global] status;

 

可以根據需要加上引數來顯示session級(當前連線,預設)和global級(自資料庫上次啟動至今)的統計結果。 
eg:

 show status like 'Com_%';

 

顯示當前連線所有統計引數的值。 
Com_xxx表示每個xxx語句執行的次數,通常需要注意的是下面幾個引數: 
Com_select/Com_insert/Com_update/Com_delte。

②定位執行效率較低的SQL語句 
·通過show processlist命令實時檢視當前SQL的執行情況; 
·通過慢查詢日誌(結束以後記錄)定位出現的問題。

③通過explain 或 desc分析低效SQL的執行計劃 
select_type(simple/primary/union/subquery)/table/type/possible_keys/key/key_len/rows/extra

④通過show profile 分析SQL 
show profile 能幫我們瞭解時間都耗費到哪裡去了。 
MySQL從5.0.37版本開始增加了show profile和show profiles語句的支援, 
通過secect @have_profiling命令能夠看到當前MySQL是否支援profile, 
通過show profiles我們能夠更清楚瞭解SQL執行的過程, 
通過show profile for query我們能看到執行過程中執行緒的每個狀態和消耗的時間。

⑤通過trace分析優化器如何選擇執行計劃 
MySQL5.6提供了對SQL的跟蹤trace,能幫我們瞭解為什麼優化器選擇執行A計劃而不是B計劃,進一步理解優化器的行為。

⑥確定問題並採取相應的優化措施

1.1.2兩個簡單實用的優化方法

①定期分析和檢查表

analyze table tbl_name;
check table tbl_name;

 

②定期優化表

optimize table tbl_name;

 

 

1.1.3常用SQL的優化

①優化insert語句 
·如果從同一客戶端插入很多行,應該儘量使用多個值表一次性插入; 
·如果從不同客戶端插入很多行,可以使用insert delayed語句先把資料放在記憶體的佇列中,並不真正寫入磁碟,比每條語句分別插入快得多; 
·當從一個文字檔案裝載一個表時,使用load data infile,這通常比使用很多insert 語句快20倍; 
·如果在MyISAM表中進行批量插入,可以通過增加bulk_insert_buffer_size變數值的方法來提高速度。

②優化 order by語句 
MySQL中有兩種排序方式,第一種通過有序索引順序掃描直接返回有效資料,不需要額外的排序,操作效率較高;第二種對返回的資料進行排序,也就是常說的Filesort排序,所有不是通過索引直接返回排序結果的排序都是filesort排序。 
優化目標:儘量通過索引直接返回有序資料,減少額外的排序。 
通過建立合適的索引能減少filesort出現,但是某些情況下,條件限制不能讓filesort消失,那就需要想辦法加快filesort的操作。filesort有兩種排序演算法,一種是一次掃描演算法(較快),二種是兩次掃描演算法。適當加大系統變數max_length_for_sort_data的值,能夠讓MySQL選擇更優化的filesort排序演算法;適當加大sort_buffer_size排序區,儘量讓排序在記憶體中完成,而不是通過建立臨時表放在檔案中進行。儘量只使用必要的欄位,select具體的欄位名稱,而不是select * 選擇所有欄位,這樣可以減少排序區的使用,提高SQL效能。

③優化group by 語句 
MySQL預設對所有group by col1,col2…的欄位進行排序,可以指定order by null禁止排序。

④優化巢狀查詢 
MySQL5.5及以下版本,子查詢的效率不如連線查詢(join),因為MySQL不需要在記憶體中建立臨時表來完成這個在邏輯上需要兩個步驟的查詢工作。

⑤優化or 查詢 
對於含有or的查詢子句,如果要利用索引,則or之間的每個條件列都必須使用索引;如果沒有索引,可以考慮增加索引。 
MySQL在處理含有or的查詢時,實際上對or的各個欄位分別查詢後的結果進行了union操作。

⑥優化分頁查詢 
·第一種 在索引上完成排序分頁操作,然後根據主鍵關聯回原表查詢所需要的其他列的內容; 
·第二種 在排序欄位不會出現重複值的情況下,新增一個引數記錄上次查詢的最後一條記錄,將limit m,n轉化成limit n.

⑦使用SQL提示 
就是在SQL語句中加入一些認為提示,讓MySQL按照特定方案執行,以達到優化操作的目的。 
·use index 指定MySQL參考的索引而忽略別的索引 
·ignore index 讓MySQL忽略某個或某些索引 
·force index 強制MySQL使用某個特定的索引

⑧其他 
·使用REGEXP,比如代替like. 
·使用rand()提取隨機行 
·表的欄位儘量不使用自增長變數,在高併發的情況下可能會對MySQL的效率有較大影響。

1.2索引優化

MySQL的索引在儲存引擎層實現,而不是在伺服器層。 
可以通過show status like ‘Handler_read%’命令來檢視索引使用情況。

1.2.1MySQL 中索引的儲存型別目前有四種(B-Tree、Hash、空間索引R-Tree、全文索引Full-text),具體和表的儲存引擎相關;MyISAM 和 InnoDB 儲存引擎都支援 B-Tree 和全文索引(Full-text,InnoDB 5.6 +);MyISAM還支援空間索引(R-Tree);Memory/Heap儲存引擎可以支援 HASH和 B-Tree 索引,不過只有Memory/Heap支援 Hash索引。

1.2.2MySQL如何使用索引

(1)MySQL使用索引的典型情景 
①匹配全值(match the full value) 
②匹配值的範圍(match a range of values) 
③匹配最左字首(match a leftmost prefix)最左匹配原則是MySQL中B-Tree索引使用的首要原則。 
④只查詢索引(index only query)當然where子句中要滿足最左匹配原則 
⑤匹配列字首(match a column prefix)使用複合索引的第一列的開頭一部分 
⑥複合索引中,一部分匹配精確內容 and 其他部分匹配一個範圍(match one part exactly and match a range on another part) 
⑦列名是索引,那麼column_name is null就會使用索引,比如where column_name is null 
(2)MySQL不使用索引的典型情景 
①like “%query”不使用B-Tree索引,但like “query%”會使用B-Tree索引。 
②資料型別出現隱式轉換的時候也不會使用索引。尤其當列型別是字串時,一定記得在where條件中把字串常量值用引號引起來,比如where last_name = ‘1’; 
③使用複合索引時,查詢條件不包含索引的最左邊部分 
④用or 分割的條件,如果其中一個列中沒有索引,則涉及的另一個索引也不會被用到。 
⑤如果MySQL估計使用索引比全表掃描更慢,則不使用索引。

2.優化資料庫物件

2.1選擇合適的儲存引擎

2.2欄位選擇合適的資料型別

procedure analyse() 可以對當前應用的表進行分析,對資料表中列的資料型別提出優化建議。

2.3三正規化和反三正規化

2.4對錶進行水平或者垂直拆分

3.針對儲存引擎的優化

優化特定引數

4.優化MySQL server

4.1MySQL記憶體管理和優化

4.2InnoDB log機制及優化

4.3調整跟併發相關的MySQL引數

(1)max_connections 
(2)back_log 
(3)table_open_cache 
(4)thread_cache_size 
(5)innodb_lock_wait_timeout

5.磁碟I/O優化

5.1使用磁碟陣列(RAID)

5.2使用Linux虛擬檔案卷模擬RAID

5.3符號連線(Symbolic Links)分佈I/O

利用作業系統的符號連線(Symbolic Links)將不同的資料庫、表或索引指向不同的物理磁碟,從而達到分佈磁碟I/O的目的。

5.4禁止作業系統更新檔案的atime屬性

5.5用裸裝置(Raw Device)存放InnoDB的共享表空間

5.6調整I/O排程演算法

5.7RAID卡電池的充放電引起的效能波動

5.8NUMA架構優化

非一致儲存訪問結構(Non-Uniform Memory Access, NUMA)

6.應用優化

6.1使用連線池

6.2減少對MySQL的訪問

①理清應用邏輯,能一次取出的資料不用兩次; 
②使用查詢快取 
MySQL的查詢快取(MySQL query cache)是4.1版本之後新增的功能,作用是儲存select的查詢文字和相應結果。如果隨後收到一個相同的查詢,伺服器會從查詢快取中重新得到查詢結果,而不再需要解析和執行查詢。 
查詢快取適用於更新不頻繁的表,當表更改(包括表結構和資料)後,查詢快取會被清空。 
③在應用端增加cache層

④負載均衡 
負載均衡(Load Balance)是實際應用中使用非常普遍的一種優化方法,它的機制就是利用某種均衡演算法,將固定的負載量分佈到不同的伺服器上,以此來減輕單臺伺服器的負載,達到優化的目的。負載均衡可以用在系統中的各個層面中,從前臺的 Web 伺服器到中間層的應用伺服器,最後到資料層的資料庫伺服器,都可以使用。 
·利用 MySQL 複製分流查詢和更新操作 
利用 MySQL 的主從複製可以有效地分流更新操作和查詢操作,具體的實現是一個主伺服器承擔更新操作,而多臺從伺服器承擔查詢操作,主從之間通過複製實現資料的同步。通過複製來分流查詢和更新是減少主資料庫負載的一個常用方法,但是這種辦法也存在一些問題,最主要的問題是當主資料庫上更新頻繁或者網路出現問題的時候,主從之間的資料可能存在比較大的延遲更新,從而造成查詢結果和主資料庫上有所差異。因此在設計應用的時候需要有所考慮。

以下是視訊教程部分

 

視訊教程截圖


 

視訊教程連結

Mysql優化視訊教程
連結:https://pan.baidu.com/s/1I7bOl8XKPOT89o9FNbbqPA 
密碼:加以下微信為好友,朋友圈裡獲取視訊連結與密碼