MySQL效能優化

2021-08-17 22:43:09 字數 3723 閱讀 2808

一、基礎知識。

1、優化目標:

合理安排資源,通過調整引數使mysql執行速度更快也更省資源。需要遵循減少系統瓶頸,減少資源占用來增加mysql系統響應速度的原則。

2、檢視資料庫效能:

| show state like 『slow_queries』 檢視慢查詢次數。

| show state like 『com_select』 檢視查詢的次數。

| show state like 『com_insert』 檢視插入的次數。

3、增加索引使查詢速度加快的原因:

資料在磁碟上是以塊的形式儲存的。為確保對磁碟操作的原子性,訪問資料的時候會一併訪問所有資料塊。mysql在執行sql語句時,預設根據條件進行全表掃瞄。如果增加索引,則會跳到增加過索引的資料塊掃瞄,大大減少需要匹配的行數【窄化搜尋範圍】,所以能增加查詢速度。

注:索引可以加快查詢的速度,但會降低增刪改資料的速度【索引增加資料庫的儲存,增刪改資料時也要維護索引,即需要花費更多的時間】。

4、char和varchar的區別與聯絡:

| char(10)存放資料定長,varchar(10)存放資料不定長,若都存放」abc」,則char佔10個位元組【其餘用空格代替】,而varchar只佔3個位元組。但char和varchar輸入資料長度不能超過10,超過長度不能輸入進去【varchar空間效率更高】。

| char的時間效率更高【長度固定,方便程式儲存和查詢】。

二、資料庫查詢優化。

1、子查詢優化:

| 使用子查詢,可以在select語句中巢狀select查詢,雖然sql靈活但執行效率不高。

| 子查詢效率不高的原因是要建立臨時表,且查詢完後需刪除,所以速度會有影響。

| 優化:使用join連線查詢代替子查詢,沒有建立臨時表的過程,速度相對更快。

2、關鍵字like、or的查詢:

| 在關鍵字like查詢時,若匹配字串的第乙個字元為萬用字元%或_,則索引匹配無效且相當於還是在全表掃瞄。

| 在關鍵字or查詢時,當只有or且or前後條件的列都原本是索引,索引才會生效。

三、資料插入優化。

1、儲存引擎myisam:

(1) myisam是mysql預設的儲存引擎,支援全文搜尋,但不支援外來鍵和事務,速度相對innodb較快。myisam表存放在三個檔案中,即frm檔案存放**定義、mydata存放資料檔案、myindex存放索引檔案。

(2) 禁用索引【優化一】:

| 當表非空時,mysql會對插入的記錄建立索引,當資料量大時建立索引會降低速度。此時可在插入前禁用索引,插入後再將索引開啟。

| 禁用:alter table table_name disable keys。

| 開啟:alter table table_name enable keys。

| 當表為空時,不需禁用操作,因為myisam在匯入資料後才建立索引。

(3) 禁用唯一性檢查【優化二】:

| 唯一性校驗會降低插入記錄的速度,可在插入記錄之前禁用,插入資料完成後再開啟。

| 禁用:set unique_checks = 0。

| 開啟:set unique_checks = 1。

(4) 批量插入資料【優化三】:

| 由於每條sql語句都要先被解析,所以一次插入資料的效率比多次插入資料更高些。

| 當需要批量插入時,load data infile的效率比insert更高。

2、儲存引擎innodb:

(1) innodb是事務型引擎,支援回滾、acid事務、多版本併發控制、崩潰恢復等,允許外來鍵且支援事務,速度相對myisam較慢。innodb的表和索引存放在乙個可以包含多個檔案的表空間中。

(2) 禁用唯一性檢查【優化一】:同myisam對唯一性檢查的禁用優化。

(3) 禁用外來鍵檢查【優化二】:

| 插入資料之前執行禁止對外鍵的檢查,資料插入完成後再恢復,可以提供插入速度。

| 禁用:set foreign_key_checks = 0。

| 開啟:set foreign_key_checks = 1。

(4) 禁止事務自動提交【優化三】:

| 插入資料之前執行禁止事務的自動提交,資料插入完成後再恢復,可以提高插入速度。

| 禁用:set autocommit = 0。

| 開啟:set autocommit = 1。

3、儲存引擎myisam和innodb的區別與聯絡:

(1) 兩者各有優點,可聯合使用設計不同表。插入資料時,影響插入速度的因素主要有索引的維護、唯一性校驗和插入資料的條數等,不同儲存引擎的優化方案也不相同。

(2) 主要區別:

| myisam鎖力度是表級;innodb支援行級鎖定【當sql不確定範圍時仍為表級掃瞄】。

| myisam支援全文索引;innodb不支援全文索引。

| myisam應用於小型應用效率更優;innodb適合大型應用。

| myisam表以檔案形式儲存,在跨平台轉移時能更加方便。

| innodb表更安全,可保證資料不丟失地切換到事務表【alter table name type=innodb】。

(3) 應用場景:

| myisam管理非事務表,可高速儲存和檢索,當需要大量select查詢時效果更好【查】。

| innodb管理事務表,支援acid事務,當有大量的insert增delete刪update改操作時可提高多使用者的併發效能【增刪改】。

四、資料庫結構優化。

1、將字段較多的表進行分解:

(1) 資料庫的結構優化需考慮資料冗餘、查詢和更新速度、欄位的資料型別合理性等。

(2) 當乙個表的資料量很大時,若有很多欄位的使用頻率很低,則會因為這些欄位的存在而降低增刪改查的速度【可將使用頻率低的字段分解出來形成乙個新的表】。

2、增加中間表減少表的關聯查詢:

(1) 對經常需要聯合查詢的表,建立中間表存放聯合查詢資料的結果。

(2) 聯合查詢改為對中間表的查詢,可以增加查詢的速度。

3、增加冗餘字段減少表的關聯查詢:

(1) 設計資料表的時候應該盡可能遵循第三正規化的標準,但合理地增加冗餘欄位可提高資料的查詢速度。

(2) 表與表之間的關係越多,連線查詢的要求也就越多,效率會越差。

(3) 當冗餘字段發生變化時,需更新其它表的此字段。

五、伺服器優化。

1、伺服器硬體優化:

(1) 硬體效能決定mysql的效能、執行速度和效率。

(2) 優化方向【減少io,提高並行】:

| 配置更大的記憶體。記憶體交換資料的速度比硬碟快,記憶體變大可增加系統的緩衝區容量,使資料在記憶體中停留的時間更長,減少磁碟io所消耗的時間【也可配置ssd固態硬碟】。

| 合理分配磁碟io。將磁碟io分散到多個硬碟上,減少資源的競爭,提高並行能力。

| 配置多核處理器。使用多核處理器可提高並行多個執行緒的能力。

2、mysql引數優化:

(1) 優化mysql的引數來提高資源利用率,從而提公升伺服器效能。

(2) 修改mysql配置引數【my.conf/my.ini】:

| sort_buffer_size:排序緩衝區大小,此值越大排序的速度越快。

| innodb_buffer_pool_size:innodb表和索引的最大快取,此值越大查詢速度越快。

| thread_cache_size:可復用的執行緒數量,若有許多新執行緒,則提高該值可提高效能。

----- end -----

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...

mysql 效能優化 命令 mysql效能優化

發現問題 當發現程式執行比較慢的時候,首先排除物力資源問題之後,就將注意力轉向mysq資料庫 1 首先確定執行慢的sql語句 mysql show full processlist 2 確認低效的查詢 多次執行第一步發現time耗費大的sql語句。檢視耗費的時間。3 分析效能 為sql生成乙個執行計...