1. 程式人生 > >mysql效能優化概述

mysql效能優化概述

MySQL效能優化概述

  效能優化是通過某些有效的方法來提高MySQL的執行速度,減少佔用的磁碟空間。效能優化包含很多方面,例如優化查詢速度,優化更新速度和優化MySQL伺服器等。本文介紹方法的主要有:

  • 優化查詢
  • 優化資料庫結構
  • 優化MySQL伺服器

  資料庫管理人員可以使用SHOW STATUS語句來查詢MySQL資料庫的效能。語法:SHOW STATUE LIKE ‘value’;其中value引數是常用的幾個統計引數。

Connections:連線MySQL伺服器的次數

Uptime:MySQL伺服器的上線時間;

Slow_queries:慢查詢的次數;

Com_select:查詢操做的次數;

Com_insert:插入操作的次數;

Com_delete:刪除操作的次數;

Com_update:更新操作的次數;

1優化查詢

       查詢操作是最頻繁的操作,提高了查詢速度可以有效提高MySQL資料庫的效能。

       首先要對查詢語句進行分析,分析查詢語句的命令是EXPLAIN語句和DESCRIBE語句。比如 EXPLAIN SELECT * FROM student  \G;

       索引可以快速定位表中的某條記錄。使用索引也可以提高資料庫查詢的速度,從而提高資料庫的效能。如果不使用索引,查詢語句將 表中的所有欄位。這樣查詢的速度會很慢。如果使用了索引,查詢語句只會查詢索引欄位。這樣就減少查詢的記錄數,達到提高查詢效率的目的。

       現在看一個查詢語句中沒有索引的使用情況:

SELECT * FROM student  WHERE name = ‘張三’;這樣會對student表中的所有資料都查詢一下,對比一下name的欄位是否是張三。

       然後我們在name欄位上建立一個名為index_name的索引:

CREATE INDEX index_name ON student(name);

現在name欄位上面已經有索引了,再進行該select語句查詢的速度就非常快了,不需要遍歷整個表。

       但是有些時候即使查詢時使用的是索引,但索引並沒有起作用。比如使用了LIKE關鍵字進行查詢時,如果匹配字串的第一個字元為‘%’,索引不會被使用。如果‘%’不是在第一個位置,索引就會被使用。

       另一種情況是在表的多個欄位上建立一個索引,比如

CREATE INDEX index ON student(birth,department);這樣只有查詢語句條件中使用欄位name時,索引才會被用到。因為name欄位是多列索引的第一個欄位,只有查詢條件中使用了name欄位才會使索引index起作用。

2優化子查詢

       很多查詢中需要使用子查詢。子查詢可以使查詢語句很靈活,但子查詢的執行效率不高。MySQL需要為內層查詢語句的查詢結果建立一個臨時表。然後外層查詢語句在臨時表中查詢記錄。查詢完畢後,MySQL需要插銷這些臨時表。所以在MySQL中可以使用連線查詢來代替子查詢。連線查詢不需要建立臨時表,其速度比子查詢要快。

3優化資料庫結構

       1將欄位很多的表分解成多個表

       有些表在設計時設定了很多的欄位。但是這個表中的有些欄位的使用頻率很低。當這個表的資料量很大時,查詢資料的速度就會很慢。對於這種欄位特別多的並且有欄位的使用頻率不高的表,就可以將其分解成多個表。

       2增加中間表

       有時需要經常查詢某兩個表中的幾個欄位。如果經常進行聯表查詢,就會降低MySQL資料庫的查詢速度。對於這種情況可以建立中間表來提高查詢速度。

       先分析經常需要同時查詢那幾個表中的那些欄位。然後將這些欄位建立一箇中間表,並將原來那幾個表的資料插入到中間表中,之後就可以使用中間表來進行查詢和統計了。

       3增加冗餘欄位

       設計資料庫表時儘量讓表達到三正規化。但是,有時為了提高查詢速度,可以有意識的在表中增加冗餘欄位。表的規範程度越高,表與表之間的關係就越多,查詢時可能經常需要在多個表之間進行連線查詢,而進行連線查詢會降低查詢速度。比如,學生的資訊儲存在student表中,院系的資訊儲存在department表中,通過student表中的dept_id欄位與department表建立關聯關係。如果要查詢一個學生所在系的名稱,必須從student表中拿到dept_id欄位,然後根據這個編號去department表中查詢系的名稱。如果需要經常需要進行這個操作的話,連線查詢會浪費很多時間。因此可以在student表中增加一個冗餘欄位dept_name,這樣就不用每次都進行連線查詢了。其實就是一切以業務為主。

       4優化插入記錄的速度

       插入記錄時,索引和唯一性校驗都會影響到插入記錄的速度。而且,一次插入多條記錄和多次插入一條記錄所消耗的時間是不一樣的。根據這些情況,分別進行不同的優化。

       禁用索引:插入記錄時,MySQL會根據表的索引對插入的記錄進行排序。如果插入大量資料時,這些排序會降低插入的速度。為了解決這種情況,在插入記錄之前先禁用索引。等插入之後再啟用索引。對於新建立的表,可以先不建立索引,等記錄都匯入以後再建立索引。這樣可以提高匯入資料的速度。

       ALTER TABLE 表名 DISABLE KEYS;

       ALTER TABLE 表名 ENABLE KEYS;

       優化INSERT語句:當大量插入資料時,建議使用一個INSERT語句插入多條記錄,而不是使用多次INSERT語句。這樣可以減少與資料庫之間的連線等操作。

       5分析表,檢查表,和優化表

分析表的主要作用是分析關鍵字的分佈。檢查表的作用是檢查表是否存在錯誤。優化表主要作用是消除刪除或者更新造成的空間浪費。

       分析表   ANALYZE TABLE 表名;  使用ANALYZE TABLE分析表的過程中,資料庫系統會對錶加一個只讀鎖。在分析表的過程中,只能讀取表的內容,不能插入和更新表的內容。ANALYZE TABLE 語句能夠分析InnoDB和MyISAM型別的表。

       檢查表使用CHECK TABLE語句。在執行過程中也會給表加上只讀鎖。

       優化表使用OPTIMIZE TABLE語句。只能優化表中的VARCHAR,BLOB,TEXT型別的欄位。OPTIMIZE TABLE語句可以消除刪除和更新造成的磁碟碎片,從而減少空間浪費。因為如果一個表使用了TEXT或者BLOB這樣的資料型別,那麼更新,刪除等操作就會造成磁碟空間的浪費。因為,更新和刪除操作以後,以前分配的磁碟空間不會自動回收。使用OPTIMIZE TABLE語句可以將這些磁碟碎片整理出來,以便再利用。

4 優化MySQL伺服器

       硬體上的優化:增加記憶體和提高磁碟讀寫速度,都可以提高MySQL資料庫的查詢,更新的速度。另一種提高MySQL效能的方式是使用多塊磁碟來儲存資料。因為可以從多塊磁碟上並行讀取資料,這樣可以提高讀取資料的速度。

       MySQL引數的優化:記憶體中會為MySQL保留部分的緩衝區。這些緩衝區可以提高MySQL的速度。緩衝區的大小都是在MySQL的配置檔案中進行設定的。

       下面對幾個重要的引數進行詳細介紹:

  • key_buffer_size:表示索引快取的大小。這個值越大,使用索引進行查詢的速度就越快
  • table_cache:表示同時開啟的表的個數。這個值越大,能同時開啟的表的個數就越多。這個值不是越大越好,因為同時開啟的表過多會影響作業系統的效能。
  • query_cache_size:表示查詢緩衝區的大小。使用查詢快取區可以提高查詢的速度。這個方式只使用與修改操作少且經常執行相同的查詢操作的情況;預設值是0.
  • Query_cache_type:表示查詢快取區的開啟狀態。0表示關閉,1表示開啟。
  • Max_connections:表示資料庫的最大連線數。這個連線數不是越大越好,因為連線會浪費記憶體的資源。
  • Sort_buffer_size:排序快取區的大小,這個值越大,排序就越快。
  • Innodb_buffer_pool_size:表示InnoDB型別的表和索引的最大快取。這個值越大,查詢的速度就會越快。這個值太大了就會影響作業系統的效能。

合理配置這些引數可以提高MySQL資料庫的效能。配置完引數後,需要重啟MySQL服務才會生效。