當你已經建立了一張表,有合適的資料型別,並新增了索引之後,其實你的工作還並沒有結束:你還需要維護你的表和索引使它們工作的更好。表的維護有三個主要的目標:發現和解決表的損壞,維護準確的索引統計,並且要降低儲存碎片。
最差的事情莫過於表已經損壞了。對於myisam,大部分是由於當機所造成的。然而,所有的儲存引擎都會由於硬體問題或者mysql內部bug再或者作業系統的原因導致索引的損壞。
損壞的索引能導致查詢返回不正確的結果,當沒有重複值出現卻丟擲重複鍵值的錯誤,或者導致查詢死鎖和當機。如果你碰到了奇怪的行為-比如乙個你意想不到的錯誤,就check table來檢視表是否損壞。check table一般可以檢查大部分表和索引的損壞。
你可以使用repair table來修復。但是並不是所有的引擎都支援這個命令。這樣你可以使用alter命令,比如修改和表相同的儲存引擎。
mysql> alter table innodb_tbl engine=innodb;
mysql的查詢優化器使用兩個api從儲存引擎中得知當決定怎樣使用索引的時候,索引是怎樣分布的。第乙個是records_in_range呼叫。它傳入終結點範圍並且返回了範圍的記錄的值。第二個就是info(),它返回了不同型別的資料,包括了索引的基數(對於每個鍵值有多少資料)。
當儲存引擎並沒有提供給優化器關於查詢行數的準確資訊,這個優化器就會使用索引的統計資訊。這個資訊你可以使用analyze table來估計下行數。mysql的優化器是基於成本的,並且最主要的消耗因素就是這個查詢要訪問多少資料。如果這個統計資訊沒有生成,或者如果它們過期了,優化器可能就會有個比較差的決定。方案就是使用analyze table來生成統計資料。
每個儲存引擎生成索引的統計資料各不相同,索引你使用analyze table的頻率也不同,同樣的消耗成本也不同:
你可以使用show index from來檢視索引資訊。
mysql> show index from sakila.actor\g
*************************** 1. row ***************************
table: actor
non_unique: 0
key_name: primary
seq_in_index: 1
column_name: actor_id
collation: a
cardinality: 200
sub_part: null
packed: null
null:
index_type: btree
comment:
*************************** 2. row ***************************
table: actor
non_unique: 1
key_name: idx_actor_last_name
seq_in_index: 1
column_name: last_name
collation: a
cardinality: 200
sub_part: null
packed: null
null:
index_type: btree
給出了很多索引資訊。mysql文件有詳細說明。我們要注意的是cardinality。這顯示了在索引中儲存引擎估算了多少個唯一的值。mysql5.0中你也可以在information_schema.statistics表中獲得這些資訊,這樣更方便了。舉個例子,如果你可以寫一條查詢information_schema的語句,來發現選擇性更低的索引。
b-tree索引比較容易有碎片。這樣會降低效能的。碎片的索引會糟糕的並且/或者不連續的存放在硬碟上。b-tree索引需要隨機硬碟訪問來「跳」到葉子頁上,因此隨機訪問是個規則,並不是例外。然而,如果他們物理儲存是連續的並且輕微壓縮的,那麼葉子頁的表現仍會很好。如果並不是這樣,我們就說它們是碎片的,並且範圍掃瞄和全索引掃瞄速度會成倍的降低。尤其是對於全索引覆蓋的語句。
表的資料儲存也會變為碎片。然而,資料儲存碎片要比索引碎片複雜的多。有兩種資料碎片:
myisam表都會遇到這兩種碎片,而innodb不會有短行的碎片。
為了去掉碎片資料,你可以使用optimize table或者丟掉和重新匯入資料。
這兩個方法對於大部分引擎來說是比較好用的。對於如myisam的引擎,通過排序演算法重新建立索引來消除碎片。到目前為止,還沒有方法消除innodb的碎片。在m又sql5.0中innodb還不同通過排序來建立索引。甚至你重新刪除和建立索引,它們還是碎片的。
對於一些不支援optimize table的儲存引擎。你可以使用alter table來重新建立表。僅僅要更改表的儲存引擎,當然這個儲存引擎就是當前表的。
mysql> alter table engine=;
索引的優點和索引的優化目標
索引的優點 索引大大減少了伺服器需要掃瞄的資料量。索引可以幫助伺服器避免排序和臨時表。索引可以將隨機1 0變為順序1 0。索引的優化目標 達到三星系統 索引將相關的記錄放到一起則獲得一星,如果索引中的資料順序和 查詢中的排列順序一致則獲得二星 如果索引中的列包含了查詢中需要的全部列則獲得 三星 索引...
索引原理和優化
mysql的基本儲存結構是頁 記錄都存在頁裡邊 各個資料頁可以組成乙個雙向鍊錶 每個資料頁中的記錄又可以組成乙個單向鍊錶 使用索引後 沒有用索引我們是需要遍歷雙向鍊錶來定位對應的頁,現在通過 目錄 就可以很快地定位到對應的頁上了!二分查詢,時間複雜度近似為 o logn 其實底層結構就是 b 樹,b...
mysql的索引和優化
索引是資料庫管理系統中乙個排序的資料結構,以協助快速查詢 更新資料庫表中資料。如果你的字典沒有目錄,你給我查乙個字,我看看。mysql 的索引分為 單例索引 主鍵索引 唯一索引 普通索引 和 組合索引。primary key 在建立表選擇主鍵的時候,預設生成主鍵索引,是一種特殊的唯一索引 不允許有空...