mysql資料庫優化是多方面的,原則是減少系統的瓶頸,減少資源的占用,增加系統的反應速度。
在mysql中,可以通過show status
語句查詢一些mysql的效能引數。如查詢連線次數,可以執行如下語句:
show status like 'connections';
如果要查詢慢查詢次數,可以執行如下語句:
show status like 'slow_queries';
一些常用的效能引數如下:
- connections:連線mysql伺服器的次數;
- uptime:mysql伺服器的上線時間;
- slow_queries:慢查詢的次數;
- com_select:查詢操作的次數(select
可以換insert
,update
,delete
,分別查詢插入、更新、刪除的次數)。
mysql資料庫優化可以從三方面考慮,分別是優化查詢、優化資料庫結構、優化mysql資料庫。
分析查詢語句。
利用索引來加快查詢速度。
優化子查詢。
通過對查詢語句的分析,可以了解查詢語句的執**況。mysql中提供了explain
和describe
來分析查詢語句。
示例如下:
explain select * from `user` where username = 'admin';
結果如圖示:
幾個引數說明一下:
- id:select識別 符。這是select的查詢序列號。
- select_type:表示select語句的型別。
- table:表示查詢的表。
- type:表示表的連線型別。all
表示 進行了全表掃瞄。這是最壞的結果。
- possible_keys:指出mysql能使用哪個索引在該表中找到行。如果為null,表示沒有相關索引。
- key:表示查詢實際使用到的索引。
- key_len:表示mysql選擇的索引欄位按位元組計算的長度。
- ref:表示使用哪個列或常數與索引一起來查詢記錄。
- rows:顯示mysql在表中進行查詢時必須檢查的行數。
- extra:表示mysql在處理查詢時的詳細資訊。
mysql中提高效能的乙個最有效的方式就是對資料表設計合理的索引。索引提供了高效的查詢資料的方法,並且加快了查詢速度。如分析查詢語句中,顯示的type為all
就是表示進行了全表掃瞄,沒有使用索引的情況。對username
新增乙個名為username_index
普通索引,再來分析查詢語句,結果如圖示:
可以看到,type型別變為ref
,這表示從表中讀取所有匹配的行,用於索引既不是unique也不是primary key 的情況,或者查詢中使用了索引列的左子集,即索引中左邊的部分列組合。
使用索引有幾種特殊情況,在這些情況下,有可能使用帶有索引的字段查詢時,索引並沒有起效,下面介紹一下這幾種特殊的情況。
使用like關鍵字的查詢語句。
在使用like關鍵字進行查詢的語句中,如果匹配字串的第乙個字元為「%」,索引不會起作用。只有「%」不在第乙個位置,索引才會起作用。
使用多列索引的查詢語句。
mysql可以為多個字段建立索引。乙個索引可以包括16個字段。對於多列索引,只有查詢條件中使用了這些欄位中的第乙個欄位時,索引才會起作用。
使用or關鍵字的查詢語句。
查詢語句的查詢條件中只有or關鍵字,且or前後的兩個條件中的列都是索引時,查詢中才使用索引。否則,查詢將不使用索引。
子查詢可以一次性完成很多邏輯上需要多個步驟才能完成的sql操作。子查詢雖然可以使查詢語句很靈活,但是執行效率不高。執行子查詢時,mysql需要為內層查詢語句的查詢結果建立乙個臨時表。然後外層查詢語句從臨時表中查詢記錄。查詢完畢後,再撤銷這些臨時表。因此,子查詢的速度會受到一定的影響。
在mysql中,可以使用連線(join)查詢來替代子查詢。連線查詢不需要建立臨時表,其速度比子查詢要快。
合理的資料庫結構不僅可以使資料庫占用更小的磁碟空間,而且能夠使查詢速度更快。資料庫結構的設計,需要考慮資料冗餘、查詢和更新的速度、欄位的資料型別是否合理等多方面的內容。
對於字段很多的表,如果有些欄位的使用頻率很低,可以將這些字段分離出來形成新錶。因為當乙個表的資料量很大時,會由於使用頻率低的字段存在而變慢。
對於需要經常聯合查詢的表,可以建立中間表以提高查詢效率。通過建立中間表,把需要經常聯合查詢的資料插入到中間表中,然後將原來的聯合查詢改為對中間表的查詢,以此來提高查詢效率。
設計資料庫表時應盡量遵循正規化理論的規約,盡可能減少冗餘字段,讓資料庫設計看起來精緻、優雅。但是,合理地加入冗餘字段可以提高查詢速度。
插入記錄時,影響插入速度的主要是索引、唯一性校驗、一次插入記錄條數等。可以分別對此進行針對性優化。
mysql提供了分析表、檢查表和優化表的語句。分析表主要是分析關鍵字的分布;檢查表主要是檢查表是否存在錯誤;優化表主要是消除刪除或者更新造成的空間浪費。
分析表:analyze table 表名;
檢查表:check table 表名;
優化表:optimize table 表名;(只能優化表中的varchar、blob或text型別的字段)
上述的這三個方法,資料庫系統都會自動對錶加乙個唯讀鎖。在分析表期間,只能讀取表中的記錄,不能更新和插入記錄。在多數場景下,不需要使用優化表,即使對可變長度的行進行了大量的更新,也不需要經常執行,每週一次或每月一次即可,並且只需要對特定的表執行。
伺服器的硬體效能直接決定著mysql資料庫的效能。硬體的效能瓶頸,也決定了資料庫的執行速度和效率。一般常用的優化伺服器硬體的方法如下:
1. 配置較大的記憶體。
2. 配置高速磁碟系統,以減少讀盤的等待時間,提高響應速度。
3. 合理分布磁碟i/o,把磁碟i/o分散在多個裝置上,以減少資源競爭,提高並行操作能力。
4. 配置多處理器,mysql是多執行緒的資料庫,多處理器可同時執行多個執行緒。
通過優化mysql的引數可以提高資源利用率,從而達到提高mysql伺服器效能的目的。
mysql服務的配置引數都在my.cnf或者my.ini檔案的[mysqld]組中。其中:
1.索引是不是越多越好?合理的索引可以提高查詢速度,但是索引也不是越多越好。在執行插入語句前,mysql要為新插入的記錄建立索引,所以過多的索引會導致插入操作變慢。
2. 如何使用查詢緩衝區?
查詢緩衝區可以提高查詢速度,但是只適合查詢語句比較多、更新語句比較少的情況,具體方式參照優化mysql引數。
MySQL效能優化速記
mysql資料庫優化是多方面的,原則是減少系統的瓶頸,減少資源的占用,增加系統的反應速度。在mysql中,可以通過show status語句查詢一些mysql的效能引數。如查詢連線次數,可以執行如下語句 show status like connections 如果要查詢慢查詢次數,可以執行如下語句...
mysql效能優化 mysql效能優化
優化方式 1.空間換時間 冗餘 2.時間換空間 字段優先使用型別 int date char varchar text 索引型別 btree索引 hash索引 索引的葉子下,存放乙個資訊指向所在行的資料位址。btree有利於範圍查詢,hash有利於精確查詢。btree用的更多一些。btree索引的常...
mysql的效能優化 mysql效能優化
檢視安裝指令碼 select version 非互動式超時時間,如jdbc show global variables like wait timeout 互動式超時時間,如資料庫工具 show global variables like interactive timeout show sessi...