您好,登錄后才能下訂單哦!
這篇文章給大家介紹MySQL數據庫中怎么優化索引查詢,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
問題描述:
我們要訪問的表是一個非常大的表,四千萬條記錄,id是主鍵,program_id上建了索引。
執行一條SQL:
select * from program_access_log where program_id between 1 and 4000
這條SQL非常慢。
我們原以為處理記錄太多的原因,所以加了id限制,一次只讀五十萬條記錄
select * from program_access_log where id between 1 and 500000 and program_id between 1 and 4000
但是這條SQL仍然很慢,速度比上面一條幾乎沒有提升。
Mysql處理50萬條記錄的表,條件字段還建了索引,這條語句應該是瞬間完成的。
問題分析:
這張表大約容量30G,服務器內存16G,無法一次載入。就是這個造成了問題。
這條SQL有兩個條件,ID一到五十萬和Program_id一到四千,因為program_id范圍小得多,選擇它做為主要索引。
先通過索引文件找出了所有program_id在1到4000范圍里所有的id,這個過程非常快。
接下來要通過這些id找出表里的記錄,由于這些id是離散的,所以mysql對這個表的訪問不是順序讀取。
而這個表又非常大,無法一次裝入內存,所以每訪問一條記錄mysql都要重新在磁盤上定位并把附近的記錄都載入內存,大量的IO操作導致了速度的下降。
問題解決方案:
1. 以program_id為條件對表進行分區
2. 分表處理,每張表的大小不超過內存的大小
然而,服務器用的是mysql5.0,不支持分區,而且這個表是公共表,無法在不影響其它項目的條件下修改表的結構。
所以我們采取了第三種辦法:
select * from program_access_log where id between 1 and 500000 and program_id between 1 and 15000000
現在program_id的范圍遠大于id的范圍,id被當做主要索引進行查找,由于id是主鍵,所以查找的是連續50萬條記錄,速度和訪問一個50萬條記錄的表基本一樣
關于MySQL數據庫中怎么優化索引查詢就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。