當我向列添加索引時,這會如何減慢執行時間? 試圖擺脫慢速查詢日誌中的查詢。 我慢查詢設置:添加索引增加查詢執行
slow_query_log = 1
long_query_time = 1 # seconds
log_queries_not_using_indexes = 1
slow_query_log_file = /var/log/mysql-slow.log
當我向列添加索引時,這會如何減慢執行時間? 試圖擺脫慢速查詢日誌中的查詢。 我慢查詢設置:添加索引增加查詢執行
slow_query_log = 1
long_query_time = 1 # seconds
log_queries_not_using_indexes = 1
slow_query_log_file = /var/log/mysql-slow.log
取決於磁盤上的數據的結構,它可能會更快,只是加載整個DB /列,並在RAM排序/篩選它(這可能發生在沒有索引存在時),而不是遍歷磁盤上的稀疏索引。我不知道這是否適用於您的具體情況,或者您是否有其他問題。
索引並不總是加速執行。索引的作用主要取決於查詢的「選擇性」:整個查詢處理了多少行。
通常,讀取數據庫(「全表掃描」)是一種高效的操作。數據庫引擎知道需要讀取哪些頁面,並可以預讀並獲取它們。這種I/O經常發生在後臺,處理頁面處於前臺。當需要下一頁時,它很有可能已經在頁面緩存中。
全表掃描的性能問題是表大。所以即使高效讀取也需要時間。當你在尋找百萬行中的一行時(「干擾針」查詢),讀取是浪費時間。這是索引修復的地方。
但是,假設您每頁有100條記錄,並且您正在閱讀的記錄超過1%。平均而言,每個頁面都需要被讀取 - 無論您是使用索引還是全表掃描。問題是索引讀取比掃描讀取效率低。預讀機制不能幫助他們,因爲讀取是隨機的。
這個問題可以通過稱爲顛簸的東西進一步加劇。如果表格不適合內存,那麼每個隨機讀取可能是「緩存未命中」,從而導致從磁盤讀取的開銷。全表掃描只會讀取數據,並且使用體面的預讀系統,不會發生緩存未命中。
在您的示例中,您可以通過在索引中包括banner
和event
(它們使用相等進行比較)和其他字段之一來提高索引的選擇性。
嘗試添加索引「橫幅」和「事件」 ALTER TABLE mod_banner ADD INDEX banner_event(banner,event)',但仍超過100ms:P http://i.imgur.com/IxWoPZU.png – michalzuber
刪除'ORDER BY'使其立即。 http://i.imgur.com/ZUQxksi。png 但我需要一個最低'last_view' – michalzuber
一個問題:如果從索引讀取會傷害性能,爲什麼引擎不決定不使用它們? –
您使用的是InnoDB還是MyISAM? – neelsg
我正在使用MyISAM – michalzuber
如果您想對基準查詢進行基準測試,請添加'SQL_NO_CACHE',因爲第二個查詢可以從mysql緩存中獲取結果,結果可能會受到影響 – Stephan