MySQL7/8:MySQL5:性能優化&視圖

一: 性能優化:

性能優化

優化MySQL數據庫是數據庫管理員和數據庫開發人員的必備技能。MySQL優化,一方面是找出系統的瓶頸,提高MySQL數據庫的整體性能;一方面需要合理的結構設計和參數調整,以提高用戶操作響應的速度;同時應該儘可能節省系統資源,以便系統可以提供更大負荷的服務。

MySQL數據庫優化是多方面的,有幾條優化原則:

1、減少系統的瓶頸

2、減少資源的佔用

3、增加系統的反應速度

 

優化查詢

1、索引對查詢的影響

我有一個book表,裏面有10條記錄,沒有索引查詢的時候:

使用了索引:

看到不使用索引的時候rows爲10,也就是說掃描了表中的10條記錄,而使用索引,rows爲1,說明掃描了表中的1條記錄,其查詢速度自然比不使用索引快。而且possible_keys和key的值都是BkNameIdx,說明查詢時使用了BkNameIdx索引

2、使用索引查詢

使用索引查詢有幾種特殊情況,特別提一下:

(1)使用LIKE關鍵字的查詢語句

在使用LIKE關鍵字進行查詢的查詢語句中,如果匹配字符串的第一個字符爲"%",索引不會起作用,只有"%"不在第一個位置,索引纔會起作用

(2)使用多列索引的查詢語句

MySQL可以爲多個字段創建索引,一個索引可以包含16個字段,對於多列索引,只有查詢條件中使用了這些字段中第一個字段時,索引纔會被使用

(3)使用OR關鍵字的查詢語句

查詢語句的查詢條件中只有OR關鍵字,且OR前後兩個條件都是索引時,查詢纔會使用索引,否則,查詢將不使用索引

3、避免使用SELECT *命令

從表中讀取的數據越多,查詢會變得越慢,始終指定需要的列,是一個良好的習慣

4、永遠爲每張表設置一個ID

我們應該爲數據庫裏的每張表都設置一個ID作爲其主鍵,而且最好是一個INT型的,並設置上自動增加的AUTO_INCREMENT標識。就算有些VARCHAR字段類型的值,它永遠不會重複,也不要設置爲主鍵,使用VARCHAR類型來當主鍵會使性能下降

 

數據庫結構優化

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

下面提供幾條優化數據庫結構的建議:

1、將字段很多的表分解爲多個表

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

2、增加中間表

對於需要經常聯合查詢的表,可以建立中間表以提高查詢效率。通過建立中間表,把需要經常聯合查詢的數據插入到中間表,然後將原來的聯合查詢改爲對中間表的查詢,以此來提高查詢效率

3、優化插入記錄的速度

插入記錄時,影響插入速度的主要是索引、唯一性校驗、一次插入記錄條數等,根據這些情況,可以分別進行優化(以使用InnoDB的表爲例):

(1)禁用唯一性檢查

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

SET UNIQUE_CHECKS = 0;
開啓唯一性檢查:

SET UNIQUE_CHECKS = 1;
(2)禁用外鍵檢查

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

SET foreign_key_checks = 0;
恢復對外鍵檢查的語句爲:

SET foreign_key_checks = 1;
(3)禁止自動提交

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

SET autocommit = 0;
恢復自動提交的語句爲:

SET autocommit = 1;

 


什麼是視圖

數據庫中的視圖是一個虛擬表。視圖是從一個或者多個表中導出的表,視圖的行爲與表非常相似,在視圖中用戶可以使用SELECT語句查詢數據,以及使用INSERT、UPDATE和DELETE修改記錄。視圖可以使用戶操作方便,而且可以保障數據庫系統安全。

視圖一經定義便存儲在數據庫中,預期相對應的數據並沒有像表那樣在數據庫中再存儲一份,通過視圖看到的數據只是存放在基本表中的數據。當對通過視圖看到的數據進行修改時,相應的基本表中的數據也要發生變化;同時,若基本表的數據發生變化,那麼這種變化也自動地反映到視圖中。

使用視圖的作用

上面創建了視圖了,看到與直接從數據表中讀取相比,視圖有以下優點:

1、簡單化

看到的就是需要的。視圖不僅可以簡化用戶對數據的理解,也可以簡化它們的操作。那些被經常使用的查詢可以被定義爲視圖,從而使得用戶不必爲以後的操作每次指定全部的條件

2、安全性

通過視圖,用戶只能查詢和修改他們所能看見的數據,數據庫中的其他數據則既看不見也取不到。數據庫授權命令可以使每個用戶對數據庫的檢索限制到特定的數據庫對象上,但不能授權到數據庫特定行和特定列上。通過視圖,用戶可以被限制在數據的不同子集上:

(1)使用權限可被限制在基表的行的子集上

(2)使用權限可被限制在基表的列的子集上

(3)使用權限可被限制在基表的行和列的子集上

(4)使用權限可被限制在多個基表的連接所限定的行上

(5)使用權限可被限制在基表的數據的統計彙總上

(6)使用權限可被限制在另一個視圖的一個子集上,或是一些視圖和基表合併後的子集上

3、邏輯數據獨立性

視圖可以幫助用戶屏蔽真實表結果變化帶來的影響

MySQL中視圖和表的區別

最後總結一下MySQL中視圖和表的區別:

1、視圖是已經編譯好的SQL語句,是基於SQL語句的結果集的可視化的表,而表不是

2、視圖沒有實際的物理記錄,而基本表有

3、表是內容,視圖是窗口

4、表佔用物理空間而視圖不佔用物理空間,視圖只是邏輯概念的存在,表可以及時對它進行修改,但視圖只能用創建的語句來修改

5、視圖是查看數據表的一種方法,可以查詢數據表中的某些字段構成的數據,只是一些SQL語句的集合。從安全的角度講,視圖可以防止用戶接觸數據表,因而用戶不知道表結構

6、表屬於全局模式中的表,是實表;視圖屬於局部模式的表,是虛表

7、視圖的建立和刪除隻影響視圖本身,不影響對應的基本表

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