MySQL性能優化第二彈!數據庫結構的優化,梅花香自苦寒來

前言

之前咱們更新MySQL優化查詢的學習內容,今天我們繼續來學習MySQL優化數據庫結構。每天深入一小時,日積月累,大廠就在向你招手!!!

一個好的數據庫設計方案對於數據庫的性能常常會起到事半功倍的效果。合理的數據庫結構不僅可以使數據庫佔用更小的磁盤空間,而且能夠使查詢速度更快。數據庫結構的設計,需要考慮數據冗餘、查詢和更新的速度、字段的數據類型是否合理等多方面的內容。

MySQL性能優化第二彈!數據庫結構的優化,梅花香自苦寒來

將字段很多的表分解成多個表

對於字段較多的表,如果有些字段的使用頻率很低,可以將這些字段分離出來形成新表。因爲當一個表的數據量很大時,會由於使用頻率低的字段的存在而變慢。

假設會員表存儲會員登錄認證信息,該表中有很多字段,如id、姓名、密碼、地址、電話、個人描述字段。其中地址、電話、個人描述等字段並不常用。可以將這些不常用字段分解出另外一個表。將這個表取名叫members_ _detail。 表中有member_ jid、address 、telephone、description 等字段。其中,member_ id是會員編號,address 字段存儲地址信息,telephone字段存儲電話信息,description 字段存儲會員個人描述信息。這樣就把會員表分成兩個表,分別爲members表和mermber_detail 表。

創建這兩個表的SQL語句如下:

MySQL性能優化第二彈!數據庫結構的優化,梅花香自苦寒來

這兩個表的結構如下:

MySQL性能優化第二彈!數據庫結構的優化,梅花香自苦寒來

如果需要查詢會員的詳細信息,可以用會員的id來查詢。如果需要將會員的基本信息和詳細信息同時顯示,可以將members表和members_ detail 表進行聯合查詢,查詢語句如下:

SELECT*FROM members LEFT JOIN members_ detail ON members .
id-members detail.
member_ id;

通過這種分解,可以提高表的查詢效率。對於字段很多且有些字段使用不頻繁的表,可以通過這種分解的方式來優化數據庫的性能。

MySQL性能優化第二彈!數據庫結構的優化,梅花香自苦寒來

增加中間表

對於需要經常聯合查詢的表,可以建立中間表以提高查詢效率。通過建立中間表,把需要經常聯合查詢的數據插入到中間表中,然後將原來的聯合查詢改爲對中間表的查詢,以此來提高查詢效率。本小節將爲讀者介紹增加中間表優化查詢的方法。

首先,分析經常聯合查詢表中的字段。然後,使用這些字段建立一箇中間表,並將原來聯合查詢的表的數據插入到中間表中。最後,可以使用中間表來進行查詢了。

會員信息表和會員組信息表的SQL語句如下:

MySQL性能優化第二彈!數據庫結構的優化,梅花香自苦寒來

查詢會員信息表和會員組信息表。

MySQL性能優化第二彈!數據庫結構的優化,梅花香自苦寒來

 

MySQL性能優化第二彈!數據庫結構的優化,梅花香自苦寒來

已知現在有一個模塊需要經常查詢帶有會員組名稱、會員組備註(remark) 、會員用戶名信息的會員信息。根據這種情況可以創建-一個temp_ _vip 表。temp_ vip表中存儲用戶名(user_ name),會員組名稱(group_ name) 和會員組備註( group_ remark) 信息。創建表的語句如下:

MySQL性能優化第二彈!數據庫結構的優化,梅花香自苦寒來

接下來,從會員信息表和會員組表中查詢相關信息存儲到臨時表中:

MySQL性能優化第二彈!數據庫結構的優化,梅花香自苦寒來

以後,可以直接從temp_ vip 表中查詢會員名、會員組名稱和會員組備註,而不用每次都進行聯合查詢。這樣可以提高數據庫的查詢速度。

增加冗餘字段

設計數據庫表時應儘量遵循範式理論的規約,儘可能減少冗餘字段,讓數據庫設計看起來精緻、優雅。但是,合理地加入冗餘字段可以提高查詢速度。本小節將爲讀者介紹通過增加冗餘字段來優化查詢速度的方法。

表的規範化程度越高,表與表之間的關係就越多,需要連接查詢的情況也就越多。例如,員工的信息存儲在staff表中,部門信息存儲在department表中。通過staff表中的department_id字段與department 表建立關聯關係。如果要查詢一個員工所在部門的名稱,必須從staff 表中查找員工所在部門]的編號(department id),然後根據這個編號去department表查找部門的名稱。如果經常需要進行這個操作,連接查詢會浪費很多時間。可以在staff 表中增加一個冗餘字段deartment. name,該字段用來存儲員工所在部門的名稱,這樣就不用每次都進行連接操作了。

冗餘字段會導致一些問題。比如,冗餘字段的值在一個表中被修改了,就要想辦法在其他表中更新該字段。否則就會使原本一致的數據變得不一致。分解表、增加中間表和增加冗餘字段都浪費了一定的磁盤空間。從數據庫性能來看,爲了提高查詢速度而增加少量的冗餘大部分時候是可以接受的。是否通過增加冗餘來提高數據庫性能,這要根據實際需求綜合分析。

優化插入記錄的速度

插入記錄時,影響插入速度的主要是索引、唯- -性校驗、 一.次插入記錄條數等。根據這些情況,可以分別進行優化。本小節將爲大家介紹優化插入記錄速度的幾種方法。

對於MyISAM引擎的表,常見的優化方法如下:

1、禁用索引

對於非空表,插入記錄時,MySQL會根據表的索引對插入的記錄建立索引。如果插入大量數據,建立索引會降低插入記錄的速度。爲了解決這種情況。可以在插入記錄之前禁用索引,數據插入完畢後再開啓索引。禁用索引的語句如下:

ALTER TABLE table name DISABLE KEYS;

其中table_ name是禁用索引的表的表名。

重新開啓索引的語句如下:

ALTER TABLE table_ name ENABLE KEYS;

對於空表批量導入數據,則不需要進行此操作,因爲MyISAM引擎的表是在導入數據之後才建立索引的。

2、禁用唯一性檢查

插入數據時,MySQL會對插入的記錄進行唯- -性校驗。 這種唯一-性校驗 也會降低插入記錄的速度。爲了降低這種情況對查詢速度的影響,可以在插入記錄之前禁用唯一性檢查,等到記錄插入完畢後再開啓。禁用唯一性 查的語句如下:

SET UNIQUE_CHECKS=0;

開啓唯一性檢查的語句如下:

SET 3 UNIQUE_CHECKS=1;

3、使用批量插入

插入多條記錄時,可以使用一條INSERT 語句插入-條記錄;也可以使用一-條 INSERT語句插入多條記錄。使用一條INSERT語句插入一條記錄的情形如下:

MySQL性能優化第二彈!數據庫結構的優化,梅花香自苦寒來

使用一條INSERT語句插入多條記錄的情形如下:

MySQL性能優化第二彈!數據庫結構的優化,梅花香自苦寒來

第2種情形的插入速度要比第1種情形快。

4、使用LOAD DATA INFILE批量導入

當需要批量導入數據時,如果能用LOAD DATA INFILE語句,就儘量使用。因爲LOAD DATA INFILE語句導入數據的速度比INSERT語句快。

對於InnoDB引擎的表,常見的優化方法如下:

  • 1、禁用唯一性檢查

插入數據之前執行set unique_ checks=0 來禁止對唯一索引的檢查, 數據導入完成之後再運行set unique_ checks=1。 這個和MyISAM引擎的使用方法一樣。

  • 2、禁用外鍵檢查

插入數據之前執行禁止對外鍵的檢查,數據插入完成之後再恢復對外鍵的檢查。禁用外鍵檢查的語句如下:

SET foreign_key_ checks=0;

恢復對外鍵的檢查語句如下:

SET foreign_key_ checks=l;
  • 3、禁止自動提交

插入數據之前禁止事務的自動提交,數據導入完成之後,執行恢復自動提交操作。禁止自動提交的語句如下:

set autocommit=0;

恢復自動提交的語句如下:

set autocommit=l ;

MySQL性能優化第二彈!數據庫結構的優化,梅花香自苦寒來

分析表、檢查表和優化表

MySQL提供了分析表、檢查表和優化表的語句。分析表主要是分析關鍵字的分佈:檢查表主要是檢查表是否存在錯誤:優化表主要是消除刪除或者更新造成的空間浪費。本小節將爲大家介紹分析表、檢查表和優化表的方法。

1、分析表

MySQL中提供了ANALYZE TABLE語句分析表ANALYZE TABLE語句的基本語法如下:

ANALYZE [LOCAL1 NO_ WRITE TO_ BINLOG] TABLE tbl_ name[, tbl_ name]...

LOCAL關鍵字是NO_ WRITE_ _TO_ BINLOG關鍵字的別名,二者都是執行過程不寫入二進制日誌,tbl_ _name 爲分析的表的表名,可以有一個或多個。

使用ANALYZE TABLE分析表的過程中,數據庫系統會自動對錶加一個只讀鎖。在分析期間,只能讀取表中的記錄,不能更新和插入記錄。ANALYZE TABLE語句能夠分析InnoDB、BDB和MyISAM類型的表。

使用ANALYZE TABLE來分析message表,執行的語句及結果如下:

MySQL性能優化第二彈!數據庫結構的優化,梅花香自苦寒來

 

上面結果顯示的信息說明如下:

  • Table: 表示分析的表的名稱。
  • Op:表示執行的操作。
  • analyze 表示進行分析操作。
  • Msg_ type: 表示信息類型,其值通常是狀態(status) 、信息(info)、注意( note )警告(warmning) 和錯誤(error) 之一。
  • Msg_ text:顯示信息。

2、檢查表

MySQL中可以使用CHECK TABLE語句來檢查表CHECK TABLE語句能夠檢查InnoDB和MyISAM類型的表是否存在錯誤。對於MyISAM類型的表,CHECK TABLE語句還會更新關鍵字統計數據。而且,CHECK TABLE也可以檢查視圖是否有錯誤,比如在視圖定義中被引用的表已不存在。該語句的基本語法如下:

CHECK TABLE tb1 name [,tbl name]...[option]...
option = {QUICK 1 FASTI MEDIUM | EXTENDED 1 CHANGED }

其中,tbl. name是表名; option 參數有5個取值,分別是QUICK、FAST、MEDIUM、EXTENDED和CHANGED。各個選項的意義分別是:

  • QUICK: 不掃描行,不檢查錯誤的連接。
  • FAST: 只檢查沒有被正確關閉的表。
  • CHANGED: 只檢查.上次檢查後被更改的表和沒有被正確關閉的表。
  • MEDIUM:掃描行,以驗證被刪除的連接是有效的。也可以計算各行的關鍵字校驗和,並使用計算出的校驗和驗證這一點。
  • EXTENDED: 對每行的所有關鍵字進行一個全面的關鍵字查找這可以確保表是100%一致的,但是花的時間較長。option只對MyISAM類型的表有效,對InnoDB類型的表無效。CHECK TABLE語句在執行過程中也會給表加上只讀鎖。

3、優化表

MySQL中使用OPTIMIZE TABLE語句來優化表。該語句對InnoDB和MyISAM類型的表都有效。但是,OPTILMIZE TABLE語句只能優化表中的VARCHAR、BLOB或TEXT類型的字段。OPTILMIZE TABLE語句的基本語法如下:

OPTIMIZE [ LOCAL | NO_WRITE_TO_BINLOG] TABLE tbL_name [,tbl name ]...

LOCAL | NO_ WRITE_ TO_ BINLOG 關鍵字的意義和分析表相同,都是指定不寫入二進制日誌; tbl_ name是表名。通過OPTIMIZE TABLE語句可以消除刪除和更新造成的文件碎片。OPTIMIZE TABLE語句在執行過程中也會給表加上只讀鎖。

一個表使用了TEXT或者BLOB這樣的數據類型,如果已經刪除了表的一大部分,或者已經對含有可變長度行的表(含有VARCHAR, BLOB或TEXT列的表)進行了很多更新,則應使用OPTIMIZE TABLE來重新利用未使用的空間,並整理數據文件的碎片。在多數的設置中,根本不需要運行OPTIMIZE TABLE。即使對可變長度的行進行了大量的更新,也不需要經常運行,每週一次或每月一次即可,並且只需要對特定的表運行。

以上就是小編整理的MySQL優化數據庫結構,算是MySQL優化的核心內容了,拋磚引玉,只是小編個人的理解,歡迎各位大佬多多討論交流,咱們共同進步!!!

喜歡小編請多多點贊評論轉發,關注小編,每天小編都會有新內容更新學習,希望更好的幫到大家學習~~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章