精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

一本大道久久a久久精二百| 国产1区2区3区精品美女| 一色桃子一区二区| 涩涩网站在线看| sis001亚洲原创区| 久久众筹精品私拍模特| 成人h片在线播放免费网站| 黄色一级视频免费观看| 久久最新网址| 日韩一卡二卡三卡| 久久久久久久久久久久久国产精品 | 国产一区二区不卡视频| 99热在线观看免费精品| 999久久久亚洲| 欧美精品一区二区三区很污很色的| 日本阿v视频在线观看| 成人动漫在线播放| 岛国av在线一区| 成人黄色av播放免费| 国产精品第9页| 一区二区日韩欧美| 国产香蕉一区二区三区在线视频 | 免费成人高清视频| 国产调教在线观看| 里番精品3d一二三区| 欧美日韩国产一级| 999香蕉视频| 18video性欧美19sex高清| 国产精品国产三级国产专播品爱网| 国产自产精品| 性中国古装videossex| 免费观看成人鲁鲁鲁鲁鲁视频| 97在线观看免费高清| 青青草免费av| 天天综合亚洲| 精品国产一区二区三区在线观看 | 中文字幕在线1| 蜜臀av一区| 欧美精品一区二区三区在线播放| 最新国产黄色网址| 激情亚洲小说| 欧美日韩一区二区三区四区| 国产成人亚洲精品无码h在线 | 国产精品久久久久久久电影| 国产一级片毛片| 中文在线一区| 午夜精品福利在线观看| 国产性70yerg老太| 国产在线日韩| 欧美精品第一页在线播放| 日韩在线中文字幕视频| 一区二区三区四区日韩| 久久成年人免费电影| 婷婷伊人五月天| 一区二区三区网站| 久久综合伊人77777| 一级黄色录像视频| 欧美体内she精视频在线观看| 欧美大胆在线视频| 青青草成人免费| 精品动漫3d一区二区三区免费版| 欧美极品在线视频| 国产午夜在线播放| 日韩电影在线观看一区| 国产精品免费久久久久久| 一二三区在线播放| 国模少妇一区二区三区| 69174成人网| 噜噜噜久久,亚洲精品国产品| av综合在线播放| 精品一区久久久久久| 你懂的视频在线观看| 中文字幕欧美日本乱码一线二线| 伊人久久大香线蕉精品| 中文字幕在线播放网址| 午夜精品久久久久久不卡8050| 奇米精品一区二区三区| 欧美色网在线| 欧美一区二区在线观看| 手机免费看av片| 禁果av一区二区三区| 色噜噜狠狠狠综合曰曰曰| 欧美精品videos极品| 久久www成人_看片免费不卡| 国产精品成人品| 999av视频| 92精品国产成人观看免费| 色播亚洲婷婷| 日本片在线看| 在线观看亚洲a| 日本黄色www| 九色精品91| 欧美成人一二三| 欧美日韩综合一区二区三区| 精品一区二区在线观看| 韩国成人一区| 免费av网站在线看| 岛国av一区二区| 国内国产精品天干天干| 日韩中出av| 久久999免费视频| 国产99免费视频| 成人一级视频在线观看| 午夜精品亚洲一区二区三区嫩草| 黄视频网站在线看| 欧美在线free| 一级特级黄色片| 你懂的国产精品| 国产精品色悠悠| 天天综合天天综合| 亚洲精品自拍动漫在线| 中文字幕欧美人妻精品一区| 亚洲午夜免费| 久久深夜福利免费观看| 黄色一级视频免费看| 岛国一区二区在线观看| 精品91一区二区三区| 日本成人伦理电影| 日韩激情av在线免费观看| 久久久精品国产sm调教网站| 久久se精品一区精品二区| 欧美高清视频一区二区三区在线观看 | 国产极品人妖在线观看| 日本韩国精品一区二区在线观看| 欧美专区第二页| 日韩欧美国产精品综合嫩v| 欧美一级片在线播放| 国产刺激高潮av| 亚洲蜜桃精久久久久久久| 日本a√在线观看| 九热爱视频精品视频| 2019中文字幕在线观看| 性生交生活影碟片| 亚洲人吸女人奶水| 天天干天天色天天干| 久久久影院免费| 国产精品视频久久久| www.亚洲.com| 欧美在线不卡视频| 久久久国产一级片| 日韩制服丝袜av| 日韩精品第一页| 亚洲第一会所| 一个人看的www久久| 波多野结衣视频观看| 2019国产精品| 国产日韩成人内射视频 | 国产盗摄精品一区二区三区在线| 在线视频91| 成人51免费| 九九热这里只有精品6| 国产99久一区二区三区a片| 亚洲摸摸操操av| 中文字幕永久免费| 亚洲国产高清视频| 免费不卡亚洲欧美| 色豆豆成人网| www国产精品视频| 国产女人爽到高潮a毛片| 亚洲精品一二三区| 黄色av电影网站| av成人天堂| 欧洲精品久久| 亚州欧美在线| 欧美高清自拍一区| 手机福利在线| 欧美性猛片xxxx免费看久爱| www.黄色com| 国产成人在线观看| 国产黄视频在线| 精品国产乱码| 成人亲热视频网站| 操喷在线视频| 亚洲视频在线播放| 国产精品人人爽| 午夜亚洲国产au精品一区二区| 日b视频在线观看| 人妖欧美一区二区| 8x8ⅹ国产精品一区二区二区| 国产精品白浆| 国产精品久久久999| 成人免费看片| 精品视频—区二区三区免费| 中文字幕+乱码+中文字幕明步| 中文字幕日本乱码精品影院| 99久久久无码国产精品性波多 | 一区二区三区日韩欧美精品 | 日韩高清在线免费观看| 国产精品吴梦梦| 美女av在线免费看| 久久偷看各类女兵18女厕嘘嘘| 色噜噜在线播放| 欧美性感一类影片在线播放| 麻豆一区二区三区精品视频| 久久久久久久久一| av不卡中文字幕| 美国av一区二区| 久久精品免费一区二区| 亚洲五月综合| 色狠狠久久av五月综合| 精品三级av| 成人福利视频在线观看| 一级毛片久久久| 欧美日韩国产成人在线观看| 国产98在线| 日韩精品日韩在线观看| 亚洲第一色视频| 欧美无人高清视频在线观看| 日韩免费观看一区二区| 亚洲色图丝袜美腿| 中文字幕第24页| 91免费国产在线| 岛国av免费观看| 国产精品一级在线| 欧美日韩亚洲自拍| 亚洲神马久久| www.好吊操| 一本一道久久a久久精品蜜桃| 欧洲在线视频一区| 美日韩黄色大片| 国产精品v欧美精品∨日韩| 日本a人精品| 国产精品99蜜臀久久不卡二区| 999福利在线视频| 九色91av视频| 羞羞网站在线看| 精品国产一区二区三区久久狼5月 精品国产一区二区三区久久久狼 精品国产一区二区三区久久久 | 黄色污污在线观看| 久久国产中文字幕| 色一情一乱一伦一区二区三欧美| 久久国产精品免费精品3p| 91在线看www| 99亚洲男女激情在线观看| 国产精品吹潮在线观看| 日韩毛片免费观看| 青草热久免费精品视频| 美女av在线免费看| 68精品国产免费久久久久久婷婷| 国产丝袜精品丝袜| 欧美激情啊啊啊| 大黄网站在线观看| 国内精品久久久| 538在线视频| 亚洲91精品在线观看| aa级大片免费在线观看| 97精品国产97久久久久久免费| 久久av色综合| 韩国三级电影久久久久久| 擼擼色在线看观看免费| 欧美中文字幕在线视频| 芒果视频成人app| 国产精品吹潮在线观看| 男女啪啪999亚洲精品| 国产主播在线一区| 欧美影院视频| 国产精品二区三区| 久久a爱视频| 免费看成人片| 精品99久久| 91精品国产吴梦梦| 狠狠综合久久av一区二区老牛| a级黄色小视频| 午夜在线精品偷拍| 污网站免费在线| 国产精品1区二区.| 亚洲精品乱码久久久久久蜜桃图片| 99精品黄色片免费大全| 成都免费高清电影| 中文字幕一区二区三区在线不卡| 91在线播放观看| 午夜影视日本亚洲欧洲精品| 日韩 国产 欧美| 91精选在线观看| 免费观看成年人视频| 亚洲欧美精品中文字幕在线| av在线免费观看网| 色中色综合影院手机版在线观看| √最新版天堂资源网在线| 国产欧美啪啪| 国产日韩欧美91| 久久九九精品视频| 国产一区二区三区四区五区在线| 西野翔中文久久精品字幕| 日韩久久久久久久| 亚洲欧美综合| 99精品人妻少妇一区二区| 奇米综合一区二区三区精品视频| 精品国产鲁一鲁一区二区三区| 国产成人高清在线| 极品人妻一区二区三区| 成人免费在线播放视频| 日韩污视频在线观看| 欧美亚洲日本一区| 韩国av免费在线| 中文字幕久精品免费视频| 国产精品一品| 国产精品亚洲综合天堂夜夜| 9l亚洲国产成人精品一区二三 | 日韩欧美久久| 欧美日韩精品久久久免费观看| 99久久亚洲精品蜜臀| 国产原创中文在线观看| 麻豆一区二区99久久久久| 农村末发育av片一区二区| 国产欧美视频一区二区三区| 欧美片一区二区| 欧美日韩在线播放一区| 天天操天天干天天爱| 久久亚洲国产精品成人av秋霞| 在线观看爽视频| 亚洲一区二区免费| 欧洲激情视频| 97视频在线免费| 国产乱码一区二区三区| 久久亚洲AV无码专区成人国产| 亚洲午夜私人影院| 99久久精品国产一区二区成人| 亚洲人av在线影院| 123区在线| 成人免费看片网站| 国产精品x453.com| 韩国视频一区二区三区| 91色九色蝌蚪| 国产黄色片视频| 欧美α欧美αv大片| 男人影院在线观看| 国产精品欧美亚洲777777| 久操国产精品| 日韩在线一级片| 99麻豆久久久国产精品免费优播| 麻豆changesxxx国产| 69堂国产成人免费视频| 91在线视频| 国产精品免费一区二区三区都可以 | 波多野结衣一区二区三区四区| 欧美一区二区视频在线观看2020| 高清在线观看av| 国产精品狼人色视频一区| 精品在线手机视频| 男人操女人免费软件| 99精品在线免费| 日日夜夜综合网| 日韩高清a**址| 日本三级一区| 久久综合九色综合网站| 日韩午夜高潮| 国产精品久久久免费观看| 五月婷婷综合激情| 熟妇人妻系列aⅴ无码专区友真希| 久久久久九九九九| 国产精品视屏| 亚洲乱码中文字幕久久孕妇黑人| 久久免费视频色| 中国a一片一级一片| 久久精品国产一区二区电影| 国产精品毛片无码| 黄色网在线视频| 成人性生交大片| 日韩视频免费观看高清| 亚洲男人av在线| 在线看欧美视频| 不卡中文字幕在线| 国产精品中文字幕欧美| 国产亚洲成人av| 日韩av有码在线| 亚洲四虎影院| 久久久无码中文字幕久...| 风间由美性色一区二区三区| 日本一级片免费看| 亚洲色图13p| av日韩在线免费观看| 久无码久无码av无码| 久久综合久久综合亚洲| 91极品身材尤物theporn| 久精品免费视频| 日韩大胆成人| 三级av免费观看| 亚洲免费色视频| 欧美套图亚洲一区| 国产欧美最新羞羞视频在线观看| 91精品国产自产在线观看永久∴ | 91麻豆国产精品久久| 中文字幕 欧美激情| 欧美第一淫aaasss性| 欧美综合自拍| 老司机久久精品| 亚洲一区二区三区不卡国产欧美| 日本电影一区二区在线观看| 国产精品日日做人人爱| 影音先锋中文字幕一区二区| 日韩一区二区a片免费观看| 这里只有精品电影| 国产精品论坛| 中文字幕精品—区二区日日骚| 福利电影一区二区| 中文字幕av影视| 69久久夜色精品国产69乱青草| 成人综合久久| 黄色性生活一级片| 91精品中文字幕一区二区三区|