2017-09-28 158 views
1

我想問一個關於數據庫中索引和優化原理的問題。優化命令如何更改說明

我正在使用mysql。模式引擎是myisam。在一個查詢中,解釋結果顯示錶格中的8000多行已被良好索引。然後我的同事在這張表中使用了「優化表」命令。之後解釋顯示2行看起來是正確的。結果是好的,但我們都不明白真正發生了什麼,爲什麼。

我是這方面的新人。那麼任何人都可以幫助解釋這個'解釋'和索引如何在優化後顯着改變?在優化表格之前,我認爲索引應該足夠好。

非常感謝!

+1

InnoDB做得更好。出於這個原因,以及其他許多人,你應該轉向InnoDB。 –

回答

0

你可以閱讀OPTIMIZE TABLE這裏的手冊:https://dev.mysql.com/doc/refman/5.7/en/optimize-table.html

對於MyISAM表,OPTIMIZE TABLE的工作方式如下:

  1. 如果該表已刪除或拆分行,修復該表。

  2. 如果索引頁未排序,請對它們進行排序。

  3. 如果表的統計信息不是最新的(修復可能不會通過排序索引來完成 ),請更新它們。

這是最後一步,你的情況最有用的。這與ANALYZE TABLE執行的工作相同。閱讀更多關於在這裏做什麼:https://dev.mysql.com/doc/refman/5.7/en/analyze-table.html

使用InnoDB時,OPTIMIZE TABLE和ANALYZE TABLE都會完全不同。閱讀文檔以瞭解更多信息。

0

這是關於索引中的「數據分佈」的全部內容。隨着時間的推移和記錄的添加,一個索引可能會變得比另一個更適合。你顯然需要一個例子:

比方說,你有一個表last_namecity字段和每個索引。如果您使用BOTH字段進行搜索,例如WHERE last_name='jones' and city='here',則可以使用的任何索引,它們都是相同的。一旦選擇了一個,則對第二個字段進行慢速搜索。

現在隨着時間的推移,city可能開始顯示比名稱更少的變異性。因此,對兩者的搜索可能表明city將產生太多的記錄以作爲第二遍篩選,其中last_name可能是更小的集合,因此更快。

優化將檢測到這種分佈並提示使用last_name優先於city以獲得更多數據和時間。

希望這是明確的......