看過(guò)好多文章炬搭,寫(xiě)過(guò)好多代碼樟凄,好多人都說(shuō)不要在for循環(huán)里去寫(xiě)查詢效率很低,后來(lái)也查了一些資料新啼,確實(shí)鞋屈,來(lái)來(lái)回回發(fā)起很多次的連接范咨、查詢、很浪費(fèi)時(shí)間厂庇,但是從來(lái)不知道究竟有多大的差距渠啊,于是乎突發(fā)奇想做了一個(gè)小小的實(shí)驗(yàn),看看差距....
不喜勿噴...
實(shí)驗(yàn)場(chǎng)景
1权旷、數(shù)據(jù)庫(kù)阿里云(單核替蛉、1G、1M帶寬)自建mysql拄氯。
2躲查、請(qǐng)求發(fā)起為本地。
3坤邪、數(shù)據(jù)庫(kù)表trade_record_0中有300W數(shù)據(jù)熙含,數(shù)據(jù)ID最小為3,最大為60000000艇纺。
4怎静、隨機(jī)生成0-6000000之間的數(shù)據(jù),分別使用for循環(huán)單個(gè)獲取黔衡,和使用sql語(yǔ)句中的in方法進(jìn)行獲取
可能出現(xiàn)的消耗
1蚓聘、網(wǎng)絡(luò)請(qǐng)求耗時(shí)
2、數(shù)據(jù)庫(kù)QPS量
3盟劫、數(shù)據(jù)庫(kù)IO讀取速度
實(shí)驗(yàn)代碼
實(shí)驗(yàn)結(jié)果
隨機(jī)生成100個(gè)ID進(jìn)行查詢
第一次:
program for get? ::: cost time:4808? get :45
sql in get? :::cost time:41? get :45
第二次:
program for get? ::: cost time:4774? get :51
sql in get? :::cost time:38? get :51
第三次:
program for get? ::: cost time:4612? get :53
sql in get? :::cost time:45? get :53
第四次:
program for get? ::: cost time:4964? get :59
sql in get? :::cost time:202? get :59
第五次:
program for get? ::: cost time:3943? get :58
sql in get? :::cost time:77? get :58
隨機(jī)生成1000個(gè)ID進(jìn)行查詢
第一次:
program for get? ::: cost time:47545? get :516
sql in get? :::cost time:209? get :516
第二次:
program for get? ::: cost time:36683? get :473
sql in get? :::cost time:202? get :473
第三次:
program for get? ::: cost time:36034? get :514
sql in get? :::cost time:407? get :514
第四次:
program for get? ::: cost time:34960? get :478
sql in get? :::cost time:298? get :478
第五次:
program for get? ::: cost time:32676? get :509
sql in get? :::cost time:167? get :509
隨機(jī)生成10000個(gè)ID進(jìn)行查詢
第一次夜牡,也是唯一一次,一次查詢耗時(shí)太長(zhǎng),沒(méi)有耐心了塘装,看看差別就知道了
program for get? ::: cost time:255325? get :4991
sql in get? :::cost time:1537? get :4991
結(jié)論
1急迂、從實(shí)驗(yàn)的結(jié)果上來(lái)看,100條以內(nèi)使用sql in批量和使用for單個(gè)查詢?nèi)ゲ樵償?shù)據(jù)耗時(shí)長(zhǎng)度相差了大概是100倍左右蹦肴,1000條以內(nèi)的耗時(shí)相差了100-200倍僚碎,而在10000條數(shù)據(jù)上,相差了多少阴幌,我也不知道了勺阐。
2、為何會(huì)出現(xiàn)這樣的情況矛双?舉個(gè)例子:要你去拿一百個(gè)蘋(píng)果渊抽,你是一次拿一個(gè),跑一百次议忽。還是一次拿完一百個(gè)再回來(lái)懒闷?
3、sql中關(guān)于in關(guān)鍵字的效率和性能問(wèn)題徙瓶,記得之前有人跟我說(shuō)過(guò)毛雇,數(shù)據(jù)量小的情況下,in沒(méi)什么影響侦镇,但是在數(shù)據(jù)量大的情況下會(huì)很很低效灵疮,我也不太清楚,但是我覺(jué)得這樣的問(wèn)題都是相對(duì)的壳繁,有的時(shí)候in會(huì)低效震捣,但是有的時(shí)候?yàn)榱藵M足某些需求,這種情況也是可取的闹炉,或者其實(shí)還有很多其他的解決方案(例如:cache),所以還是那句話蒿赢,問(wèn)題都是相對(duì)的。
4渣触、還有個(gè)關(guān)鍵字叫做exist羡棵。