国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > MySQL > 正文

MySQL數據庫索引查詢優化的分享

2024-07-24 12:58:15
字體:
來源:轉載
供稿:網友

問題描述:
我們要訪問的表是一個非常大的表,四千萬條記錄,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萬條記錄的表基本一樣

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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 乌兰浩特市| 会宁县| 昌吉市| 绥棱县| 柳林县| 泸水县| 静安区| 滨海县| 上栗县| 平塘县| 新源县| 长沙市| 汉源县| 平武县| 临朐县| 平定县| 区。| 法库县| 岳普湖县| 南丹县| 天长市| 镇远县| 磴口县| 四川省| 会理县| 二连浩特市| 团风县| 岚皋县| 晴隆县| 建始县| 蒙城县| 金华市| 颍上县| 莱阳市| 阿荣旗| 广宁县| 花莲县| 青田县| 赤壁市| 神农架林区| 二手房|