数据库结构优化介绍
介紹了很多對數據庫性能會帶來的因素,包括服務器的硬件,操作系統,MYSQL服務器配置等等,但是總的來說,對數據庫性能影響最大的呢,實際上就是數據庫的結構了
良好的數據庫邏輯設計和物理設計是數據庫設計獲得高性能的基礎,會要求我們在設計數據庫時,不能只考慮數據庫需要,還要考慮我們將來,要怎樣來使用我們數據庫來編寫,查詢語句才能得到我們的數據,所以我們也要使用我們的查詢語句呢,來設計我們的數據庫結構,結構的設計呢,最好是使得數據庫的查詢語句呢,盡量的簡單,為了達到這個目的,通常我們需要考慮很多的因素,如果我們根據查詢對表進行反范式化的設計,那么可能是可以加快一些語句的查詢速度的,范式又會對其他查詢語句造成性能上的影響,所以我們在進行數據庫設計時,一定要平衡各方面的利益,以達到最好的效果,總的來說呢,我們進行數據庫設計呢,希望可以達到以下幾個目的的,首先我們進行數據庫結構設計呢,期望達到的第一個目的呢,減少數據的冗余,那么什么是數據冗余呢,數據冗余就是指,相同的數據,在多個地方呢存在,或者說,表中的某個列呢,由其他列來計算得到,這樣的數據呢就是冗余,這應該很好理解,但是有一點需要注意,我們這里說的是要盡量減少數據的冗余,而不是要完全的沒有冗余的數據,因為在一些情況下呢,必要的數據冗余呢,也是必須的,在我們的下面數據設計中呢,大家就會看到,數據庫設計的第二個目的呢,就是要避免在數據維護中,出現插入,更新,刪除異常,對于數據維護的異常呢,理解起來就不像數據冗余那么容易了,我們可能需要分別來為大家講解一下,所謂插入異常呢,從定義上來看呢,是這樣的,如果表中的某個實體,隨著另一個實體的存在而存在,也就是說,如果缺少了某個實體,就無法表示另一個實體,那么這樣設計出來的表呢,插入異常,是不太好理解,我們來看一個實際的表就清楚了
我們進入到dbs數據庫use dbs;這里呢我們有這樣的一張表show create table selectcourse\G
現在這個selectcourse的表結構,這張表記錄了每一個學生,和講課的名稱,和學分,其中學號和課程名稱呢,是這個表的主鍵,也就是說,一個學生只能選擇相同的課程一次,我們下面來看一下這個表的數據,這樣理解起來可能就會更加的直觀select * from selectcourse;
現在這個表中一共存在了4行數據,首先大家可以看到這個表是存在數據冗余問題的,其中多次出現了學生的姓名,生日這些信息,另外沒門課程的學分呢,也是冗余的,那么什么是插入異常呢,如果我們要新增加一門課程,語文,并且學分是10分,但是還沒有任何學生來選擇這門課程,那么我最后可以單獨的把這個信息插入到這個表中,我們可以來看一下,我們insert into,selectcourse這張表,其中我們只想插入課程信息,課程的名稱和課程的學分,比如我們要插入語文課,他的學分是10分insert into selectcourse(course_name,course_point) values('語文',10);
可以看到,這里就爆出了一個異常,學號這一列是沒有默認值的,并且由于學號是我們主鍵的一部分,所以不能為空,所以這里就產生了剛才所說的插入異常,在沒有學生選擇這門課的情況下,是無法把新插入的課程,插入到表中的,搞清楚了數據的插入異常,繼續往下看,那么什么是數據的更新異常呢,更新異常是這樣子的,如果更改表中的某個實體的單獨屬性時,需要對多行進行更新,那么這個表就存在更新異常,依然讓人不太好理解,還是回到我們的演示系統中來看一下
如果這個時候要更新數學的學分為15,那么我們要同時更新多少行數據呢,我們來看一下,現在我們數學這門課程的學分,等于15分update selectcourse set course_point = 15 where course_name = '數學';
這個時候我們同時更新了兩行數據,如果我們選擇這門課程的學生越多,表更新的數據也會越多,這就是更新異常的表現,可以看到數據的更新異常,數據的冗余,是有很大的聯系的,那最后我們再來看看什么是刪除異常,其實刪除異常和插入異常,看上去差不多,如果我們刪除了某一個表中的實體,則會導致其他實體的消失,這就是刪除異常,以我們的演示來說吧,如果我們刪除了選擇數學的選課記錄,那是不是數學這么課程的相關信息也就不存在了呢,是這樣的,這就是刪除數據的異常體現,那我們對數據庫進行設計呢,就要盡量避免上面所說的異常,如果要想避免這些數據的異常,那么最好的方法呢,按照范式化來對表進行設計,這個呢我們會說到,我們對數據庫結構優化的第三個目的是什么
節約數據庫的存儲空間,那這個就比較好理解了,如果我們減少了數據冗余,就必然會節約很多的存儲空間,不要小看存儲空間,對于大的數據庫來說,可能是可以節約很多空間的,當然了,我們對數據庫設計那就是提高查詢的效率,這一點在項目當中一定會有引用,這里就不多說了
?
總結