3 資料庫結構優化和建索引

2021-05-10 03:11:25 字數 2435 閱讀 1399

優化乙個設計得很糟糕或者索引建得很差的資料庫可以成數量級的提高效能。如果你想得到高效能的話,你就必須根據你即將執行的

sql來設計資料庫表結構和索引。同時你應該對於不同型別的查詢效能的需求有乙個預估,因為對於一類查詢的修改或者表結構的改變可能會影響其他的行為。比如說,為了提高查詢效率而增加的索引會降低更新的速度。同樣的,乙個非歸一化的表結構可能在提高一些型別的查詢效率的同時降低另外一些的效率。新增計數和彙總表是乙個優化查詢的好路子,但是它也會帶來維護上的問題。

有時候你需要超越乙個開發者的職能,去質疑提到你面前的業務需求。那些不懂資料庫系統的人通常會提出一些會影響效能的業務需求。如果你告訴他們,乙個很小的功能可能會要求兩倍於現在的硬體時,他們很可能砍掉這個需求。

表結構優化以及建立索引不僅需要對系統有乙個整體的把握,同時也要求對細節有足夠的關注。你需要理解整個系統以期明白系統的各個部分之間是如何相互影響的。本章從資料型別的討論開始,接下來到索引策略以及歸一化。最後針對儲存引擎提前了一些注意點。

mysql

支援許多種資料型別,因此選取正確的資料型別來儲存你的資料是提高效能乙個很重要的指標。下面是一些很簡單的指標,它可以幫助你來作出正確的選擇,不管你正在儲存的是什麼型別的資料。

n越小越好

一般來說,盡量使用可以正確儲存和表示你的最小資料型別。資料越小一般來說也就越快,因為他們占用的磁碟空間、記憶體以及

cpu快取更小。他們一般也會使用更小的

cpu週期來處理。

確保你沒有低估你需要儲存的資料的範圍,因為如果你確實需要增加資料型別的範圍的話,你會發現這是乙個很費時費力的事情。如果你對於選擇哪一種資料型別有疑惑,那麼就選擇你認為不會超過資料範圍的最小型別(如果系統負載不是很重,或者沒有儲存很多資料的話,或者你正在處於設計的前期的話,你可以在以後很容易的修改它)。

n簡單即美

越簡單的資料型別一般也就需要越少的

cpu週期去處理。比如說,整數就比字串更容易比較大小,因為字元以及它的比較規則使得字串比較變得更加複雜。這裡有兩個例子:在

mysql

中你應該使用它的內建型別而不是字串來儲存日期和時間,另外你也應該使用整數來儲存

ip位址。這些內容我們會在後面的章節中詳細討論。

盡可能避免

null

如果可能的話,你要將所有的列都定義為

not null

的。許多表包括了一些可以為

null

的列,甚至應用中根本就不需要儲存

null

(即沒有資料),這一切僅僅是因為它的預設值是

null

。除非你確認需要使用

null

,否則你都要把那些列設定為

not null。在

mysql

中優化乙個包括

null

的列是很困難的,因為它會使得建索引,索引統計以及值比較變得更加困難。乙個可以為

null

的列在mysql

中需要使用更多的空間以及特殊的處理方式。當乙個可以為

null

的列在建索引時,每條記錄需要乙個額外的

byte

,甚至可能導致乙個定長的索引(比如在單個整數列上的索引)在

myisam

上被轉換成乙個變長的索引。

即使你的確需要儲存乙個

null

在資料表中,你可能也不需要

null

。可能考慮用

0或者其他一些特殊的值,或者空字串來表示。將乙個

null

列變成乙個

not null

的列並不會帶來效能上多大的提公升,因為不必要花時間去查詢並將已經使用的表結構中的一些

null

列轉換成

not null

的,除非你確定這些

null

列造成了問題。然而,如果你打算對這些列建索引,那麼還是盡量避免使用

null

吧。對乙個給定的列決定使用何種資料型別的第一步是確定它的基本型別到底是什麼:數字,字串,臨時變數等等。這一般會很直觀,但是我們也會注意到在某些特定的情況下選擇並不明朗。

第二步就是選擇乙個特定的型別。

mysql

的許多資料型別可以儲存同一種型別的資料,但是它們的儲存範圍,精度,或者物理空間會有所不同。一些資料型別可能還有一些特殊的表現或者屬性。

比如說,乙個

datetime

和乙個timestamp

列都可以儲存精確到秒的日期和時間。然而,

timestamp

只使用datetime

的一半空間,並且是時區自適應的,同時也有一些自動更新的功能。另一方面,它只有乙個很小的範圍,有些時間它的特殊功能會變成障礙。

接下來我們將會討論一些基礎資料型別。

mysql

為了相容性支援許多別名,如

integer, bool

和numeric

。這些只是別名而已,他們可能會引起歧義,但是並不會影響效能。

資料庫查詢和資料庫 MySQL 索引的優化建議

索引是幫助mysql高效獲取資料的資料結構,在儲存引擎中實現的,所以每種儲存引擎中的索引都不一樣。那麼,資料庫中的索引有什麼作用?引入索引的目的是為了加快查詢速度。如果資料量很大,大的查詢要從硬碟載入資料到記憶體當中。一 資料庫查詢效能的優化涉及到的技術面非常廣,一般建議用以下幾個手段實行 1 減少...

資料庫索引 索引優化

二 三星索引 三 合適設計理想索引 謂詞簡單謂詞和複雜謂詞 where字句中的每個條件稱為乙個謂詞。過濾因子 描述了謂詞的選擇性,即表中滿足謂詞條件的記錄行數所佔的比例 過濾因子 ff 結果集的數量 錶行的數量 平均過濾因子 1 不同列值的數量 索引片及匹配列 乙個索引定義乙個索引片,如果where...

資料庫優化 索引

鑑於csdn無故刪除博文,本部落格不再更新,暫時遷至 2索引每一本書的前幾頁一般都是目錄,而最後幾頁通常會有乙個關鍵字索引。對於資料庫來講系統表 如 sysobjects等 就是目錄,而標字段上的索引就如同書本後面的關鍵字索引。資料庫中,目錄 資料字典 和索引的區別 目錄縱向 索引橫向。優化器根據統...