我想問一個關於數據庫中索引和優化原理的問題。優化命令如何更改說明
我正在使用mysql。模式引擎是myisam。在一個查詢中,解釋結果顯示錶格中的8000多行已被良好索引。然後我的同事在這張表中使用了「優化表」命令。之後解釋顯示2行看起來是正確的。結果是好的,但我們都不明白真正發生了什麼,爲什麼。
我是這方面的新人。那麼任何人都可以幫助解釋這個'解釋'和索引如何在優化後顯着改變?在優化表格之前,我認爲索引應該足夠好。
非常感謝!
我想問一個關於數據庫中索引和優化原理的問題。優化命令如何更改說明
我正在使用mysql。模式引擎是myisam。在一個查詢中,解釋結果顯示錶格中的8000多行已被良好索引。然後我的同事在這張表中使用了「優化表」命令。之後解釋顯示2行看起來是正確的。結果是好的,但我們都不明白真正發生了什麼,爲什麼。
我是這方面的新人。那麼任何人都可以幫助解釋這個'解釋'和索引如何在優化後顯着改變?在優化表格之前,我認爲索引應該足夠好。
非常感謝!
你可以閱讀OPTIMIZE TABLE這裏的手冊:https://dev.mysql.com/doc/refman/5.7/en/optimize-table.html
對於MyISAM表,OPTIMIZE TABLE的工作方式如下:
如果該表已刪除或拆分行,修復該表。
如果索引頁未排序,請對它們進行排序。
如果表的統計信息不是最新的(修復可能不會通過排序索引來完成 ),請更新它們。
這是最後一步,你的情況最有用的。這與ANALYZE TABLE執行的工作相同。閱讀更多關於在這裏做什麼:https://dev.mysql.com/doc/refman/5.7/en/analyze-table.html
使用InnoDB時,OPTIMIZE TABLE和ANALYZE TABLE都會完全不同。閱讀文檔以瞭解更多信息。
這是關於索引中的「數據分佈」的全部內容。隨着時間的推移和記錄的添加,一個索引可能會變得比另一個更適合。你顯然需要一個例子:
比方說,你有一個表last_name
和city
字段和每個索引。如果您使用BOTH字段進行搜索,例如WHERE last_name='jones' and city='here'
,則可以使用的任何索引,它們都是相同的。一旦選擇了一個,則對第二個字段進行慢速搜索。
現在隨着時間的推移,city
可能開始顯示比名稱更少的變異性。因此,對兩者的搜索可能表明city
將產生太多的記錄以作爲第二遍篩選,其中last_name
可能是更小的集合,因此更快。
優化將檢測到這種分佈並提示使用last_name
優先於city
以獲得更多數據和時間。
希望這是明確的......
InnoDB做得更好。出於這個原因,以及其他許多人,你應該轉向InnoDB。 –