Mysql資料庫索引查詢優化的分享

2021-07-04 16:49:53 字數 1425 閱讀 3579

這是昨天sae分享的一篇文章,開始的時候,我看了一遍,發現好象沒有什麼特別的內容,但再仔細看的時候,發現居然可以這樣做。。。

問題描述:

我們要訪問的表是乙個非常大的表,四千萬條記錄,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範圍小得多,mysql選擇它做為主要索引。

先通過索引檔案找出了所有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萬條記錄的表基本一樣

總結:這是乙個在千萬筆記錄表中由於使用了索引導致了資料查詢變慢的問題,有一定的典型性和大家交流下!

-----------

看我標紅的那一段,原來還能夠這樣做,以前真的沒有注意過,也從來沒有想過,先利用主鍵做一次過濾。這樣效率會好很多啊

上述內容來自:該**還有很多技巧值得一看。

資料庫索引 優化查詢

新增索引的幾種方法 1.新增primary key 主鍵索引 alter tabletable nameadd primary key column table name 表名 column 字段 將table name表的column欄位設定為主鍵 2.新增unique 唯一索引 alter ta...

資料庫查詢和資料庫 MySQL 索引的優化建議

索引是幫助mysql高效獲取資料的資料結構,在儲存引擎中實現的,所以每種儲存引擎中的索引都不一樣。那麼,資料庫中的索引有什麼作用?引入索引的目的是為了加快查詢速度。如果資料量很大,大的查詢要從硬碟載入資料到記憶體當中。一 資料庫查詢效能的優化涉及到的技術面非常廣,一般建議用以下幾個手段實行 1 減少...

mysql資料庫優化索引 mysql資料庫索引調優

一 mysql索引 1 磁碟檔案結構 innodb引擎 frm格式檔案儲存表結構,ibd格式檔案儲存索引和資料。myisam引擎 frm格式檔案儲存表結構,myi格式檔案儲存索引,myd格式檔案儲存資料 2 mysql資料庫資料範問原理 innodb btree 1 ibd檔案中主鍵構建b tree...