精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

百萬商品查詢,性能提升了10倍

數據庫 其他數據庫
我們都知道數據庫連接有限,一般是配置的空閑連接數是100-1000之間。如果多余1000的請求,就只能等待,就可能會出現接口超時的情況。

前言

最近在我的知識星球中,有個小伙伴問了這樣一個問題:百萬商品分頁查詢接口,如何保證接口的性能?

這就需要對該分頁查詢接口做優化了。

這篇文章從9個方面跟大家一起聊聊分頁查詢接口優化的一些小技巧,希望對你會有所幫助。

圖片圖片

1 增加默認條件

對于分頁查詢接口,如果沒有特殊要求,我們可以在輸入參數中,給一些默認值。

這樣可以縮小數據范圍,避免每次都count所有數據的情況。

對于商品查詢,這種業務場景,我們可以默認查詢當天上架狀態的商品列表。

例如:

select * from product 
where edit_date>='2023-02-20' and edit_date<'2023-02-21' and status=1

如果每天有變更的商品數量不多,通過這兩個默認條件,就能過濾掉絕大部分數據,讓分頁查詢接口的性能提升不少。

溫馨提醒一下:記得給時間和狀態字段增加一個聯合索引。

2 減少每頁大小

分頁查詢接口通常情況下,需要接收兩個參數:pageNo(即:頁碼)和pageSize(即:每頁大小)。

如果分頁查詢接口的調用端,沒有傳pageNo默認值是1,如果沒有傳pageSize也可以給一個默認值10或者20。

不太建議pageSize傳入過大的值,會直接影響接口性能。

在前端有個下拉控件,可以選擇每頁的大小,選擇范圍是:10、20、50、100。

前端默認選擇的每頁大小為10。

不過在實際業務場景中,要根據產品需求而且,這里只是一個參考值。

3 減少join表的數量

有時候,我們的分頁查詢接口的查詢結果,需要join多張表才能查出數據。

比如在查詢商品信息時,需要根據商品名稱、單位、品牌、分類等信息查詢數據。

這時候寫一條sql可以查出想要的數據,比如下面這樣的:

select 
  p.id,
  p.product_name,
  u.unit_name,
  b.brand_name,
  c.category_name
from product p
inner join unit u on p.unit_id = u.id
inner join brand b on p.brand_id = b.id
inner join category c on p.category_id = c.id
where p.name='測試商品' 
limit 0,20;

使用product表去join了unit、brand和category這三張表。

其實product表中有unit_id、brand_id和category_id三個字段。

我們可以先查出這三個字段,獲取分頁的數據縮小范圍,之后再通過主鍵id集合去查詢額外的數據。

我們可以把sql改成這樣:

select 
  p.id,
  p.product_id,
  u.unit_id,
  b.brand_id,
  c.category_id
from product
where name='測試商品'
limit 0,20;

這個例子中,分頁查詢之后,我們獲取到的商品列表其實只要20條數據。

再根據20條數據中的id集合,獲取其他的名稱,例如:

select id,name 
from unit
where id in (1,2,3);

然后在程序中填充其他名稱。

偽代碼如下:

List<Product> productList = productMapper.search(searchEntity);
List<Long> unitIdList = productList.stream().map(Product::getUnitId).distinct().collect(Collectors.toList());
List<Unit> unitList = UnitMapper.queryUnitByIdList(unitIdList);
for(Product product: productList) {
   Optional<Unit> optional = unitList.stream().filter(x->x.getId().equals(product.getId())).findAny();
   if(optional.isPersent()) {
      product.setUnitName(optional.get().getName());
   } 
}

這樣就能有效的減少join表的數量,可以一定的程度上優化查詢接口的性能。

4 優化索引

分頁查詢接口性能出現了問題,最直接最快速的優化辦法是:優化索引。

因為優化索引不需要修改代碼,只需回歸測試一下就行,改動成本是最小的。

我們需要使用explain關鍵字,查詢一下生產環境分頁查詢接口的執行計劃。

看看有沒有創建索引,創建的索引是否合理,或者索引失效了沒。

索引不是創建越多越好,也不是創建越少越好,我們需要根據實際情況,到生產環境測試一下sql的耗時情況,然后決定如何創建或優化索引。

建議優先創建聯合索引。

如果你對explain關鍵字的用法比較感興趣,可以看看我的這篇文章《explain | 索引優化的這把絕世好劍,你真的會用嗎?》。

如果你對索引失效的問題比較感興趣,可以看看我的這篇文章《聊聊索引失效的10種場景,太坑了》。

5 用straight_join

有時候我們的業務場景很復雜,有很多查詢sql,需要創建多個索引。

在分頁查詢接口中根據不同的輸入參數,最終的查詢sql語句,MySQL根據一定的抽樣算法,卻選擇了不同的索引。

不知道你有沒有遇到過,某個查詢接口,原本性能是沒問題的,但一旦輸入某些參數,接口響應時間就非常長。

這時候如果你此時用explain關鍵字,查看該查詢sql執行計劃,會發現現在走的索引,跟之前不一樣,并且驅動表也不一樣。

之前一直都是用表a驅動表b,走的索引c。

此時用的表b驅動表a,走的索引d。

為了解決Mysql選錯索引的問題,最常見的手段是使用force_index關鍵字,在代碼中指定走的索引名稱。

但如果在代碼中硬編碼了,后面一旦索引名稱修改了,或者索引被刪除了,程序可能會直接報錯。

這時該怎么辦呢?

答:我們可以使用straight_join代替inner join。

straight_join會告訴Mysql用左邊的表驅動右邊的表,能改表優化器對于聯表查詢的執行順序。

之前的查詢sql如下:

select p.id from product p
inner join warehouse w on p.id=w.product_id;
...

我們用它將之前的查詢sql進行優化:

select p.id from product p
straight_join warehouse w on p.id=w.product_id;
...

6 數據歸檔

隨著時間的推移,我們的系統用戶越來越多,產生的數據也越來越多。

單表已經到達了幾千萬。

這時候分頁查詢接口性能急劇下降,我們不能不做分表處理了。

做簡單的分表策略是將歷史數據歸檔,比如:在主表中只保留最近三個月的數據,三個月前的數據,保證到歷史表中。

我們的分頁查詢接口,默認從主表中查詢數據,可以將數據范圍縮小很多。

如果有特殊的需求,再從歷史表中查詢數據,最近三個月的數據,是用戶關注度最高的數據。

7 使用count(*)

在分頁查詢接口中,需要在sql中使用count關鍵字查詢總記錄數。

目前count有下面幾種用法:

  • count(1)
  • count(id)
  • count(普通索引列)
  • count(未加索引列)

那么它們有什么區別呢?

  • count(*) :它會獲取所有行的數據,不做任何處理,行數加1。
  • count(1):它會獲取所有行的數據,每行固定值1,也是行數加1。
  • count(id):id代表主鍵,它需要從所有行的數據中解析出id字段,其中id肯定都不為NULL,行數加1。
  • count(普通索引列):它需要從所有行的數據中解析出普通索引列,然后判斷是否為NULL,如果不是NULL,則行數+1。
  • count(未加索引列):它會全表掃描獲取所有數據,解析中未加索引列,然后判斷是否為NULL,如果不是NULL,則行數+1。

由此,最后count的性能從高到低是:

count(*) ≈ count(1) > count(id) > count(普通索引列) > count(未加索引列)

所以,其實count(*)是最快的。

我們在使用count統計總記錄數時,一定要記得使用count(*)。

8 從ClickHouse查詢

有些時候,join的表實在太多,沒法去掉多余的join,該怎么辦呢?

答:可以將數據保存到ClickHouse。

ClickHouse是基于列存儲的數據庫,不支持事務,查詢性能非常高,號稱查詢十幾億的數據,能夠秒級返回。

為了避免對業務代碼的嵌入性,可以使用Canal監聽Mysql的binlog日志。當product表有數據新增時,需要同時查詢出單位、品牌和分類的數據,生成一個新的結果集,保存到ClickHouse當中。

查詢數據時,從ClickHouse當中查詢,這樣使用count(*)的查詢效率能夠提升N倍。

需要特別提醒一下:使用ClickHouse時,新增數據不要太頻繁,盡量批量插入數據。

其實如果查詢條件非常多,使用ClickHouse也不是特別合適,這時候可以改成ElasticSearch,不過它跟Mysql一樣,存在深分頁問題。

9 數據庫讀寫分離

有時候,分頁查詢接口性能差,是因為用戶并發量上來了。

在系統的初期,還沒有多少用戶量,讀數據請求和寫數據請求,都是訪問的同一個數據庫,該方式實現起來簡單、成本低。

剛開始分頁查詢接口性能沒啥問題。

但隨著用戶量的增長,用戶的讀數據請求和寫數據請求都明顯增多。

我們都知道數據庫連接有限,一般是配置的空閑連接數是100-1000之間。如果多余1000的請求,就只能等待,就可能會出現接口超時的情況。

因此,我們有必要做數據庫的讀寫分離。寫數據請求訪問主庫,讀數據請求訪問從庫,從庫的數據通過binlog從主庫同步過來。

根據不同的用戶量,可以做一主一從,一主兩從,或一主多從。

數據庫讀寫分離之后,能夠提升查詢接口的性能。

責任編輯:武曉燕 來源: 蘇三說技術
相關推薦

2025-05-27 01:55:00

TypeScript開發者項目

2022-04-21 07:51:51

場景JavaSQL

2021-02-02 15:38:19

Disruptor緩存Java

2022-09-09 09:33:14

支付寶代碼性能

2025-09-30 02:11:00

2022-09-21 17:43:29

Kafka底層網絡

2011-07-01 10:11:39

2023-03-22 13:53:26

芯片英偉達

2024-07-17 08:25:44

2021-08-02 10:50:57

性能微服務數據

2014-03-26 10:00:06

RailsRails性能

2014-04-01 09:52:46

MySQL

2021-09-13 10:25:35

開發技能代碼

2024-12-13 13:58:53

2025-05-09 02:00:00

代碼接口吞吐量

2022-09-27 18:19:32

Java數據結構

2020-07-22 08:30:02

代碼開發工具

2020-07-21 15:40:55

NginxJava服務器

2020-03-26 12:38:15

代碼節點數據
點贊
收藏

51CTO技術棧公眾號

免费不卡中文字幕在线| av在线播放av| 亚洲欧美日本国产专区一区| 亚洲天天在线日亚洲洲精| 国产小视频精品| 亚洲妇熟xxxx妇色黄| ww亚洲ww在线观看国产| 国产在线拍偷自揄拍精品| 国产无遮挡又黄又爽| 精品视频亚洲| 亚洲精品成人久久| 在线视频观看91| 日韩伦理三区| 亚洲一区二区三区四区在线观看| 欧洲一区二区在线观看| 国产999久久久| 日韩精品电影一区亚洲| 欧美国产日韩精品| 国精产品视频一二二区| 亚洲宅男网av| 亚洲国产91精品在线观看| 91视频这里只有精品| 中文字幕乱码在线播放| 亚洲一级不卡视频| 永久免费在线看片视频| 久久久资源网| 99视频一区二区三区| 99电影网电视剧在线观看| 一本一道人人妻人人妻αv| 久久国产精品亚洲77777| 国内精品一区二区三区四区| 国产精品国产三级国产传播| 欧美日韩国产高清电影| 日韩精品亚洲视频| 小毛片在线观看| 网站一区二区| 日韩一区和二区| 精品久久久99| 日韩深夜福利网站| 欧美视频在线一区| 久久久精品麻豆| 国产日韩另类视频一区| 狠狠躁夜夜躁人人爽超碰91| 国产毛片视频网站| 波多野在线观看| 亚洲综合男人的天堂| 神马午夜伦理影院| 91精品久久久久久粉嫩| 亚洲激情校园春色| 国产 国语对白 露脸| free性欧美hd另类精品| 亚洲人成亚洲人成在线观看图片 | 成年人视频免费在线观看| 久久久久9999亚洲精品| 欧美一区观看| 成人在线免费公开观看视频| 国产农村妇女精品| 欧美亚洲视频一区| av在线播放观看| 亚洲综合免费观看高清完整版| 日本免费a视频| 国产h片在线观看| 欧美性猛交丰臀xxxxx网站| 日韩欧美精品在线观看视频| 制服诱惑亚洲| 欧美理论片在线| 亚洲成人福利视频| 欧美中文一区| 最新国产精品拍自在线播放 | 亚洲字幕久久| 欧美大片大片在线播放| 97免费在线观看视频| 老牛影视一区二区三区| 国产中文日韩欧美| 亚洲精品成av人片天堂无码 | 久久激情五月婷婷| 91精品国产高清久久久久久91裸体| 高清一区二区三区四区| 久久久久国产精品麻豆ai换脸| 亚洲日本欧美在线| 图片区小说区亚洲| 欧美性猛交xxxx乱大交| 久久人人爽av| 久久av国产紧身裤| 中文字幕亚洲一区二区三区| 欧美黑吊大战白妞| 日韩国产欧美视频| 粉嫩高清一区二区三区精品视频| 日韩精品系列| 亚洲免费视频成人| 日本成年人网址| 国产一区二区三区视频在线 | www.成人av.com| av在线资源网| 亚洲成人免费av| 激情五月俺来也| 激情视频极品美女日韩| 日韩亚洲欧美中文高清在线| 久久夜色精品亚洲| 国产在线日韩欧美| 欧美性天天影院| 午夜dj在线观看高清视频完整版| 色噜噜狠狠色综合欧洲selulu| 91精品人妻一区二区三区四区| 天堂成人娱乐在线视频免费播放网站 | 在线日韩视频| 国产欧美精品xxxx另类| 天天综合天天色| 亚洲三级免费电影| 国产视频在线视频| 久久悠悠精品综合网| 日韩中文字幕在线看| 亚洲成人第一网站| aaa亚洲精品一二三区| 一区二区三区四区免费观看| 婷婷午夜社区一区| 日韩电视剧在线观看免费网站| 欧美丰满熟妇bbbbbb| 免费成人av资源网| 欧美一区观看| 亚洲人成午夜免电影费观看| 日韩免费性生活视频播放| 国精品人伦一区二区三区蜜桃| 国产日韩视频| 精品视频第一区| 男女视频在线| 日韩一区二区三区四区| 91n在线视频| 美女一区二区三区| 日韩尤物视频| 高潮一区二区| 亚洲女人初尝黑人巨大| 欧美啪啪小视频| 成人精品免费视频| 国产不卡一区二区视频| 中文在线免费一区三区| 欧美男插女视频| 国产福利视频导航| 亚洲精品欧美激情| 永久看看免费大片| 国产精品jizz在线观看美国| 91最新在线免费观看| а√中文在线8| 91精品国产高清一区二区三区 | 亚洲综合五月| 91亚洲人电影| 先锋影音在线资源站91| 日韩精品一区二区在线观看| 久久久精品99| www.成人在线| 夫妻免费无码v看片| 一区二区小说| 国产精品免费一区二区三区都可以| 懂色一区二区三区| 精品视频色一区| 色偷偷www8888| 国产精品一区二区在线观看不卡 | 免费观看成人性生生活片 | 全部av―极品视觉盛宴亚洲| 婷婷五月色综合| 91亚洲精品在看在线观看高清| 久久综合色影院| 亚洲精品久久久狠狠狠爱| 亚洲h在线观看| 日本黄色网址大全| 美女在线视频一区| 亚洲熟妇无码av在线播放| 精品精品精品| 精品国模在线视频| 在线观看成人动漫| 国产美女诱惑一区二区| 久久久久久九九九九| 欧美性猛交xxx高清大费中文| 黄页网站免费观看| 午夜天堂精品久久久久| 不卡视频一区| 色戒汤唯在线观看| 一区国产精品视频| 国产成年妇视频| 精品久久久久久久久久久久久| 亚洲永久精品ww.7491进入| 蜜桃av一区二区三区电影| 国产欧美自拍视频| 偷窥自拍亚洲色图精选| 国产色视频一区| mm视频在线视频| 中文字幕精品www乱入免费视频| 99国产精品99| 日本久久精品电影| 久久精品波多野结衣| 久久精品视频在线免费观看| 性久久久久久久久久久久久久| 亚洲精品美女| 中文字幕一区二区三区四区五区六区| 136导航精品福利| 国产精品视频色| www555久久| 色噜噜国产精品视频一区二区| www.天天干.com| 在线观看视频91| 国产极品美女高潮无套嗷嗷叫酒店| 中文字幕av资源一区| 成人在线视频免费播放| 精品一区二区久久| 国产精品秘入口18禁麻豆免会员| 亚洲精品国产首次亮相| 欧美中日韩免费视频| 一区二区三区四区精品视频| 国产精品自拍网| 国偷自产一区二区免费视频| 久久久久九九九九| 国产黄a三级三级三级av在线看| 亚洲码在线观看| 秋霞欧美在线观看| 91精品国产麻豆国产自产在线| 最近中文字幕在线视频| 精品高清一区二区三区| 久久久久噜噜噜亚洲熟女综合| 国产精品看片你懂得| 国产特级黄色录像| 99re热这里只有精品视频| 日本wwwxx| 精品系列免费在线观看| 亚洲国产精品三区| 西西人体一区二区| 成人毛片视频网站| 在线观看不卡| www插插插无码免费视频网站| 亚欧美无遮挡hd高清在线视频| 亚洲 国产 日韩 综合一区| 亚洲精品国模| 久久综合九色99| 老司机精品在线| 精品产品国产在线不卡| 国产丝袜一区| 韩国一区二区三区美女美女秀| 超碰成人在线观看| 国产高清精品一区二区| 爱高潮www亚洲精品| 国产精品国产精品| 超碰成人免费| 久久久久久久久久久一区| 久久365资源| 玛丽玛丽电影原版免费观看1977 | 污视频在线看网站| 久久99精品视频一区97| 欧美bbbxxxxx| 午夜精品美女自拍福到在线| 黄色在线免费观看网站| 97超碰蝌蚪网人人做人人爽| 小视频免费在线观看| 欧美一级片一区| 韩国精品主播一区二区在线观看| 国产精品久久久久999| 成人日韩av| 亚洲www视频| 99re91这里只有精品| 国产精品免费看一区二区三区| 久久精品亚洲成在人线av网址| 女同一区二区| 日韩av专区| 大桥未久一区二区三区| 精品动漫一区| 国产精品第12页| 美女在线视频一区| 亚洲国产综合av| av一区二区三区在线| 成人午夜剧场视频网站| 国产精品国产三级国产aⅴ中文| 四虎精品免费视频| 亚洲成人777| 久久久久久无码精品大片| 欧美日韩电影在线播放| 国产极品久久久| 日韩精品视频在线观看网址| 国产最新视频在线观看| 久久深夜福利免费观看| sm久久捆绑调教精品一区| 日本欧美在线视频| 95精品视频| 欧美二区在线| 66国产精品| 国产最新免费视频| 久久er精品视频| 国产精品一区二区人妻喷水| 中文一区在线播放| 国产精品999久久久| 欧美亚洲自拍偷拍| 亚洲国产精品suv| 一区二区国产精品视频| 大桥未久在线播放| 国产精品热视频| 高潮久久久久久久久久久久久久 | 欧美主播一区二区三区| a在线观看视频| 亚洲欧美日韩国产精品| 亚洲综合伊人久久大杳蕉| 国产成人激情小视频| 6080亚洲理论片在线观看| 视频一区二区在线| 精品福利电影| 天天久久综合网| 国产欧美精品一区| 国产又爽又黄的视频| 日韩一区二区在线看| 成人在线高清视频| 久久久人成影片一区二区三区| 久久精品超碰| 欧美日韩国产不卡在线看| 红桃视频欧美| 亚洲av无日韩毛片久久| 久久精品夜夜夜夜久久| 男人的天堂一区二区| 日韩欧美高清在线| 久久99精品久久久久久野外| 奇米一区二区三区四区久久| 风间由美一区二区av101| 自拍偷拍亚洲色图欧美| 日韩av成人高清| 尤物视频最新网址| 懂色av中文一区二区三区天美| 午夜精品久久久久久久99热黄桃| 色偷偷91综合久久噜噜| 丁香婷婷久久| 日韩经典在线视频| 日日夜夜精品视频免费| 蜜桃传媒一区二区亚洲av| 精品久久久久久亚洲国产300 | 日韩精品一级| 蜜臀av.com| 国产尤物一区二区在线| 午夜激情福利电影| 3atv在线一区二区三区| 久草免费在线观看| 国产综合香蕉五月婷在线| 日韩一区亚洲二区| 精品久久久99| 亚洲人成伊人成综合网小说| 国产精品热久久| 久久久精品免费| 国产午夜久久av| 久操手机在线视频| aaa欧美日韩| 69视频免费在线观看| 亚洲欧美成人在线| 无人区在线高清完整免费版 一区二| 日韩久久久久久久| 蜜桃在线一区二区三区| 久久久久久久麻豆| 欧美一二三区在线观看| 182在线视频观看| 久久久久久精| 麻豆一区二区三区| 国产精品精品软件男同| 日韩欧美激情在线| av在线加勒比| 欧美高清视频一区二区三区在线观看| 老妇喷水一区二区三区| 99re6热在线精品视频| 91精品久久久久久久久99蜜臂| 日韩伦理av| 久久久久资源| 日本欧美大码aⅴ在线播放| 久久精品在线观看视频| 日韩欧美国产综合| 九色porny视频在线观看| 日韩精品第一页| 久草精品在线观看| 国产亚洲精品久久777777| 亚洲男人天堂九九视频| 在线观看欧美| 福利视频一区二区三区四区| 国产亚洲精品久| 99久久久无码国产精品免费| 91国产高清在线| 波多野结衣在线播放一区| 亚洲欧美一区二区三区不卡| 亚洲成年人网站在线观看| 成人精品一区二区三区免费| 1卡2卡3卡精品视频| 香蕉久久久久久久av网站| 最新日韩免费视频| 亚洲精品在线三区| 九九热这里有精品| 国产一区二区网| 国产精品久久久久aaaa樱花| 免费看黄网站在线观看| 国产成人欧美在线观看| 午夜久久tv| 国产精品理论在线| 亚洲国产精品999| 日韩在线激情| 国产在线观看福利| 亚洲精品一卡二卡| 韩国中文字幕2020精品| 操一操视频一区| 六月丁香婷婷久久| 波多野结衣视频网站| 欧美日韩国产二区| 日韩电影免费网址|