日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

MySQL 百萬級數據的4種查詢優(yōu)化方式

瀏覽:208日期:2023-10-01 19:51:17
目錄一.limit越往后越慢的原因二.百萬數據模擬1、創(chuàng)建員工表和部門表,編寫存儲過程插數據2.執(zhí)行存儲過程三.4種查詢方式1.普通limit分頁2.使用索引覆蓋+子查詢優(yōu)化3.起始位置重定義4,降級策略(百度的做法)一.limit越往后越慢的原因

當我們使用limit來對數據進行分頁操作的時,會發(fā)現:查看前幾頁的時候,發(fā)現速度非??欤热?limit 200,25,瞬間就出來了。但是越往后,速度就越慢,特別是百萬條之后,卡到不行,那這個是什么原理呢。先看一下我們翻頁翻到后面時,查詢的sql是怎樣的:

select * from t_name where c_name1=’xxx’ order by c_name2 limit 2000000,25;

這種查詢的慢,其實是因為limit后面的偏移量太大導致的。比如像上面的 limit 2000000,25 ,這個等同于數據庫要掃描出 2000025條數據,然后再丟棄前面的 20000000條數據,返回剩下25條數據給用戶,這種取法明顯不合理。

MySQL 百萬級數據的4種查詢優(yōu)化方式

二.百萬數據模擬1、創(chuàng)建員工表和部門表,編寫存儲過程插數據

/*部門表,存在則進行刪除 */drop table if EXISTS dep;create table dep( id int unsigned primary key auto_increment, depno mediumint unsigned not null default 0, depname varchar(20) not null default '', memo varchar(200) not null default '');/*員工表,存在則進行刪除*/drop table if EXISTS emp;create table emp( id int unsigned primary key auto_increment, empno mediumint unsigned not null default 0, empname varchar(20) not null default '', job varchar(9) not null default '', mgr mediumint unsigned not null default 0, hiredate datetime not null, sal decimal(7,2) not null, comn decimal(7,2) not null, depno mediumint unsigned not null default 0);/* 產生隨機字符串的函數*/DELIMITER $drop FUNCTION if EXISTS rand_string;CREATE FUNCTION rand_string(n INT) RETURNS VARCHAR(255)BEGIN DECLARE chars_str VARCHAR(100) DEFAULT ’abcdefghijklmlopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ’; DECLARE return_str VARCHAR(255) DEFAULT ’’; DECLARE i INT DEFAULT 0; WHILE i < n DO SET return_str = CONCAT(return_str,SUBSTRING(chars_str,FLOOR(1+RAND()*52),1)); SET i = i+1; END WHILE; RETURN return_str;END $DELIMITER;/*產生隨機部門編號的函數*/DELIMITER $drop FUNCTION if EXISTS rand_num;CREATE FUNCTION rand_num() RETURNS INT(5)BEGIN DECLARE i INT DEFAULT 0; SET i = FLOOR(100+RAND()*10); RETURN i;END $DELIMITER;/*建立存儲過程:往emp表中插入數據*/DELIMITER $drop PROCEDURE if EXISTS insert_emp;CREATE PROCEDURE insert_emp(IN START INT(10),IN max_num INT(10))BEGIN DECLARE i INT DEFAULT 0; /*set autocommit =0 把autocommit設置成0,把默認提交關閉*/ SET autocommit = 0; REPEAT SET i = i + 1; INSERT INTO emp(empno,empname,job,mgr,hiredate,sal,comn,depno) VALUES ((START+i),rand_string(6),’SALEMAN’,0001,now(),2000,400,rand_num()); UNTIL i = max_num END REPEAT; COMMIT;END $DELIMITER;/*建立存儲過程:往dep表中插入數據*/DELIMITER $drop PROCEDURE if EXISTS insert_dept;CREATE PROCEDURE insert_dept(IN START INT(10),IN max_num INT(10))BEGIN DECLARE i INT DEFAULT 0; SET autocommit = 0; REPEAT SET i = i+1; INSERT INTO dep( depno,depname,memo) VALUES((START+i),rand_string(10),rand_string(8)); UNTIL i = max_num END REPEAT; COMMIT;END $DELIMITER;2.執(zhí)行存儲過程

/*插入120條數據*/call insert_dept(1,120);/*插入500W條數據*/call insert_emp(0,5000000);

插入500萬條數據可能很慢

三.4種查詢方式1.普通limit分頁

/*偏移量為100,取25*/SELECT a.empno,a.empname,a.job,a.sal,b.depno,b.depnamefrom emp a left join dep b on a.depno = b.depno order by a.id desc limit 100,25;/*偏移量為4800000,取25*/SELECT a.empno,a.empname,a.job,a.sal,b.depno,b.depnamefrom emp a left join dep b on a.depno = b.depno order by a.id desc limit 4800000,25;

執(zhí)行結果

[SQL]SELECT a.empno,a.empname,a.job,a.sal,b.depno,b.depnamefrom emp a left join dep b on a.depno = b.depno order by a.id desc limit 100,25;受影響的行: 0時間: 0.001s[SQL]SELECT a.empno,a.empname,a.job,a.sal,b.depno,b.depnamefrom emp a left join dep b on a.depno = b.depno order by a.id desc limit 4800000,25;受影響的行: 0時間: 12.275s

越往后,查詢效率越慢

2.使用索引覆蓋+子查詢優(yōu)化

因為我們有主鍵id,并且在上面建了索引,所以可以先在索引樹中找到開始位置的 id值,再根據找到的id值查詢行數據。

/*子查詢獲取偏移100條的位置的id,在這個位置上往后取25*/SELECT a.empno,a.empname,a.job,a.sal,b.depno,b.depnamefrom emp a left join dep b on a.depno = b.depnowhere a.id >= (select id from emp order by id limit 100,1)order by a.id limit 25;/*子查詢獲取偏移4800000條的位置的id,在這個位置上往后取25*/SELECT a.empno,a.empname,a.job,a.sal,b.depno,b.depnamefrom emp a left join dep b on a.depno = b.depnowhere a.id >= (select id from emp order by id limit 4800000,1)order by a.id limit 25;

執(zhí)行結果

[SQL]SELECT a.empno,a.empname,a.job,a.sal,b.depno,b.depnamefrom emp a left join dep b on a.depno = b.depnowhere a.id >= (select id from emp order by id limit 100,1)order by a.id limit 25;受影響的行: 0時間: 0.106s[SQL]SELECT a.empno,a.empname,a.job,a.sal,b.depno,b.depnamefrom emp a left join dep b on a.depno = b.depnowhere a.id >= (select id from emp order by id limit 4800000,1)order by a.id limit 25;受影響的行: 0時間: 1.541s3.起始位置重定義

適用于主鍵是自增主鍵的表

/*記住了上次的分頁的最后一條數據的id是100,這邊就直接跳過100,從101開始掃描表*/SELECT a.id,a.empno,a.empname,a.job,a.sal,b.depno,b.depnamefrom emp a left join dep b on a.depno = b.depnowhere a.id > 100 order by a.id limit 25;/*記住了上次的分頁的最后一條數據的id是4800000,這邊就直接跳過4800000,從4800001開始掃描表*/SELECT a.id,a.empno,a.empname,a.job,a.sal,b.depno,b.depnamefrom emp a left join dep b on a.depno = b.depnowhere a.id > 4800000order by a.id limit 25;

[SQL]SELECT a.id,a.empno,a.empname,a.job,a.sal,b.depno,b.depnamefrom emp a left join dep b on a.depno = b.depnowhere a.id > 100 order by a.id limit 25;受影響的行: 0時間: 0.001s[SQL]SELECT a.id,a.empno,a.empname,a.job,a.sal,b.depno,b.depnamefrom emp a left join dep b on a.depno = b.depnowhere a.id > 4800000order by a.id limit 25;受影響的行: 0時間: 0.000s

這個效率是最好的,無論怎么分頁,耗時基本都是一致的,因為他執(zhí)行完條件之后,都只掃描了25條數據。

4,降級策略(百度的做法)

這個策略是最簡單有效的,因為一般的大數據查詢都會有搜索條件,沒人會關注100頁以后的內容,當用戶查詢頁數過大時,給它返回一個錯誤就行了,例如百度就只能搜索到76頁

以上就是MySQL 百萬級數據的4種查詢優(yōu)化方式的詳細內容,更多關于MySQL 百萬級數據查詢優(yōu)化的資料請關注好吧啦網其它相關文章!

標簽: MySQL 數據庫
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
精品国产一级| 亚洲一区导航| 国产精品国产三级在线观看| 日韩国产成人精品| 亚洲免费婷婷| 久久福利影视| 日韩欧美在线精品| 国产精品啊啊啊| 久久这里只有| 999精品在线| 在线亚洲一区| 日韩激情综合| 欧美国产另类| 日韩欧美网址| 香蕉成人久久| 欧美日本久久| 日韩三区免费| 日韩一区精品视频| 欧美在线精品一区| 麻豆91在线播放| 日韩理论片av| 老色鬼久久亚洲一区二区| 日韩福利在线观看| а√在线中文在线新版| 午夜亚洲福利在线老司机| 欧美亚洲三级| 欧美午夜精彩| 欧美日韩一视频区二区| 日韩精品永久网址| 亚洲一区欧美二区| 国产亚洲欧美日韩在线观看一区二区| 国产一区二区三区免费在线| 蜜臀久久99精品久久一区二区| 亚洲欧美日韩专区| 欧美伊人影院| 日韩中文在线播放| 无码日韩精品一区二区免费| 免费在线亚洲| 不卡中文一二三区| 国产图片一区| 黄色成人91| 久久久免费人体| 国产亚洲福利| 高清一区二区| 日本精品一区二区三区在线观看视频| 国产一区二区三区不卡av| 国产午夜久久| 国产成人在线中文字幕| 蜜桃av一区二区在线观看| 免费视频一区二区三区在线观看| 欧美日韩国产传媒| 国产一区调教| 日韩欧美2区| 久久影视一区| 久久午夜影院| 日韩黄色av| 最新亚洲激情| 三上悠亚国产精品一区二区三区 | 欧美啪啪一区| 99国产精品久久久久久久成人热| 久久男人av| 日本欧洲一区二区| 亚洲成人国产| 国产suv精品一区二区四区视频 | 日本v片在线高清不卡在线观看| 欧美sss在线视频| 国产精品免费99久久久| 在线看片一区| 在线视频免费在线观看一区二区| 鲁鲁在线中文| 久久精品天堂| 欧美日韩亚洲一区| 一区二区亚洲视频| 亚洲在线观看| 国产综合婷婷| 精精国产xxxx视频在线野外| 精品淫伦v久久水蜜桃| 欧美自拍一区| 日韩国产欧美三级| 日韩激情av在线| 日韩精品一页| 日韩久久99| 日韩福利视频导航| 日韩不卡一二三区| 欧美一级二级视频| 久久国产精品免费一区二区三区| 一区二区亚洲视频| 蜜臀91精品一区二区三区| 欧美日韩视频一区二区三区| www成人在线视频| 日韩av福利| 中文字幕系列一区| 亚洲v在线看| 激情综合网址| 午夜日韩av| 久久国产精品亚洲77777| 国产视频亚洲| 男人的天堂久久精品| 久久高清国产| 综合欧美精品| 亚洲精品欧美| 亚洲精品乱码日韩| 青青国产精品| 国产美女亚洲精品7777| 国产精品sss在线观看av| 日本亚洲不卡| 国产精品久久久久久模特| 国产精品nxnn| 国产一区二区三区四区二区| 91视频精品| 久久青草久久| 国内亚洲精品| 99日韩精品| 婷婷亚洲成人| 日韩精品第一| 精品久久视频| 电影亚洲精品噜噜在线观看| 欧美日韩黑人| 美女网站久久| 国产日韩一区二区三免费高清| 日韩成人一级| 国产精品magnet| 国产网站在线| 美女精品一区| 国产精品色在线网站| 国产精品二区不卡| 国产精品88久久久久久| 亚洲专区视频| 国产精品igao视频网网址不卡日韩 | 久久国产欧美日韩精品| 精品丝袜久久| 不卡一区综合视频| 亚洲精品九九| 久久中文字幕一区二区三区| 日本免费一区二区三区四区| 美女尤物久久精品| 国产精品啊v在线| 国产在线|日韩| 亚洲精品免费观看| 91亚洲国产| 亚洲人成在线影院| 高清久久一区| 快she精品国产999| 国产精久久一区二区| 综合日韩av| 蜜桃视频第一区免费观看| 国产精品黄网站| 婷婷亚洲五月色综合| 清纯唯美亚洲综合一区| 日韩一区欧美| 日本麻豆一区二区三区视频| 成人亚洲欧美| 亚洲91在线| 99久久夜色精品国产亚洲狼| 日韩av网站免费在线| 国产v综合v| 国产欧美日韩一级| 免费精品国产| 久久国产三级| 婷婷精品进入| 九九久久国产| 亚洲人成毛片在线播放女女| av资源中文在线天堂| 91亚洲精品在看在线观看高清| 久久一级电影| 日本一区二区高清不卡| 青草av.久久免费一区| 黄色日韩在线| 日产精品一区| 久久99国产精品视频| 亚洲精品欧美| 午夜电影亚洲| 神马日本精品| 国产精品99久久免费观看| 老牛影视一区二区三区| 亚洲四虎影院| 国产精品福利在线观看播放| 欧美亚洲免费| 亚洲三级观看| 亚洲一区欧美二区| 久久婷婷亚洲| 97精品97| 麻豆一区二区在线| 91福利精品在线观看| 在线精品一区| 国产一级久久| 亚洲免费精品| 狠狠色综合网| 国产综合精品| 特黄特色欧美大片| av免费不卡国产观看| 国产一区二区三区四区二区| 国产精品成人3p一区二区三区| 日本一区二区三区视频在线看| 亚洲一区成人| 国产农村妇女精品一二区| 亚洲二区三区不卡| 99久久www免费| 日韩大片在线| 亚洲免费福利|