Mysql更新效能優化 MySQL效能優化

2021-10-19 19:37:49 字數 3752 閱讀 1421

效能優化是通過某些有效的方法來提高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服務才會生效。

Mysql批量插入更新效能優化

對於資料量較大的插入和更新,因io cpu等效能瓶頸,會產生大量的時間消耗,目前主流的優化主要包括預編譯 單條sql插入多條資料 事務插入等,下面詳細介紹一下 單條插入 mybatis insert into sys city city code,city name,province name,al...

mysql批量更新資料 效能優化

最近做的遊戲,上線後出了不少問題,所以我就經常去查資料庫資料,翻各種日誌等,但是在查詢的時候發現好蛋疼,有些地方的時間是寫 2016 08 11 20 13 02 這種格式,有些地方的時間是寫 1470917582000 這種格式,然後多張表資料進行對比的時候就很蛋疼,我得不停進行時間轉換,噁心得不...

mysql效能優化 mysql效能優化

優化方式 1.空間換時間 冗餘 2.時間換空間 字段優先使用型別 int date char varchar text 索引型別 btree索引 hash索引 索引的葉子下,存放乙個資訊指向所在行的資料位址。btree有利於範圍查詢,hash有利於精確查詢。btree用的更多一些。btree索引的常...