成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

使用查詢分離后,從20s優化到500ms,牛哇!

開發 前端
那具體怎么實現呢?咱們來看看代碼。假設咱們用的是Java,首先,咱們得在寫數據庫的時候,把數據也發到MQ里去。
今天咱們來聊聊最近我們小伙伴一個技術上的小突破,之前我們系統里有個大數據量的表,每次查詢都得等上20秒,簡直讓人崩潰。但用了查詢分離之后,嗖的一下,速度就提到了500毫秒,是不是牛哇~

那咱們先來聊聊,為啥之前查詢那么慢呢?其實啊,原因也簡單,就是因為數據量太大了。你想啊,一個表里有幾千萬條數據,每次查詢還得關聯十幾個子表,每個子表的數據也是上億條,這能不慢嗎?咱們雖然用了索引、優化了SQL,但效果還是不明顯。這就像是你讓一個胖子去跑馬拉松,他跑得動嗎?跑不動啊!

所以啊,咱們就得想辦法給這個“胖子”減減肥,這就是查詢分離的思路啦。咱們在寫數據的時候,順便把數據發到一個消息隊列(MQ)里,然后異步地寫到Elasticsearch(ES)里去。這樣,查詢的時候就不去主表湊熱鬧了,直接去ES里查,那速度可就快多了。

那具體怎么實現呢?咱們來看看代碼。假設咱們用的是Java,首先,咱們得在寫數據庫的時候,把數據也發到MQ里去。這里咱們用RabbitMQ作為例子:

import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.Channel;


public class MessageSender {
    private final static String QUEUE_NAME = "data_queue";


    public void send(String message) throws Exception {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");
        try (Connection connection = factory.newConnection();
             Channel channel = connection.createChannel()) {
            channel.queueDeclare(QUEUE_NAME, false, false, false, null);
            channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
            System.out.println(" [x] Sent '" + message + "'");
        }
    }
}

這段代碼就是往MQ里發消息的。咱們在寫數據庫的時候,調用這個send方法,把數據作為消息發出去。

然后,咱們得有個消費者來監聽這個MQ,把消息異步地寫到ES里去。這里咱們用Elasticsearch的Java客戶端來操作ES:

import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.CreateIndexResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.common.xcontent.XContentType;


public class EsDataWriter {
    private RestHighLevelClient client;


    public EsDataWriter(RestHighLevelClient client) {
        this.client = client;
    }


    public void writeToEs(String indexName, String jsonData) throws Exception {
        IndexRequest indexRequest = new IndexRequest(indexName);
        indexRequest.source(jsonData, XContentType.JSON);
        IndexResponse indexResponse = client.index(indexRequest, RequestOptions.DEFAULT);
        System.out.println("Data written to ES with id: " + indexResponse.getId());
    }
}

這段代碼就是往ES里寫數據的。咱們在MQ的消費者里,拿到消息后,調用這個writeToEs方法,把數據寫到ES里去。那這樣,查詢的時候咱們就不去主表查了,直接去ES里查。那速度,嗖嗖的,500毫秒就出結果了。

但是啊,這里有個問題,就是數據還沒同步到ES的時候,立馬去查,查不到怎么辦?這個嘛,咱們也有辦法。咱們可以在數據庫里加個字段,比如叫es_synced,表示數據是否已經同步到ES了。ES消費者寫入ES后可以更新一下這個字段,查詢單條數據的時候,咱們先查這個字段,如果已經同步了,就直接去ES里查;如果還沒同步,就等一會兒再查,或者從主表里查。

如果是批量查多條數據那就不用做這個處理了,只允許查出來已經同步到ES的數據就可以了!

那歷史數據怎么遷移呢?這個其實也不難。咱們可以寫個腳本,把主表里的數據分批查出來,然后發到MQ里去,讓消費者異步地寫到ES里去。這樣,歷史數據也就遷移到ES里了。

總的來說啊,這個查詢分離的思路還是挺實用的。它就像是一個減肥的方法,讓咱們的“胖子”數據庫跑得快了起來。當然啦,這個方法也不是萬能的,比如如果數據量實在太大了,寫入速度也會受影響。但是啊,對于大部分場景來說,這個方法還是挺好用的。

好啦,今天咱們就聊到這里啦。如果你也有類似的困擾,不妨試試這個方法~

責任編輯:武曉燕 來源: 石杉的架構筆記
相關推薦

2022-09-19 08:41:02

數據查詢分離

2023-09-27 08:21:00

查詢分離數據API

2024-05-28 08:47:52

2022-06-30 19:40:36

查詢接口索引優化

2022-08-14 14:32:06

接口優化

2022-09-27 08:40:44

慢查詢MySQL定位優化

2023-12-25 08:24:03

雙異步數據庫Excel

2022-07-05 10:50:31

數據庫查詢實戰

2021-01-14 16:28:15

蠕蟲病毒刪除系統安全專家

2020-02-23 17:15:29

SQL分析查詢

2020-09-01 11:10:39

數據庫鏈接池HikariCP

2019-06-20 11:20:25

sql優化數據庫

2023-05-14 17:16:22

分類樹SpringBoot

2024-10-28 07:00:00

分頁查詢優化索引數據歸檔

2025-02-14 09:30:42

2024-09-29 08:21:06

2014-01-09 09:35:26

2019-08-21 14:35:18

壓縮文件優化過程Java

2011-11-30 11:46:25

2025-06-25 09:30:14

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美国产日韩一区二区三区 | www.47久久青青 | 手机在线一区二区三区 | 亚洲欧美日韩一区二区 | 日日干干| 99re视频在线 | 久久精品色欧美aⅴ一区二区 | 亚洲国产一区在线 | 精品久久久久久久久久久久久久久久久 | 一区在线观看 | 国产精品高清在线 | 91超碰在线| 国产精品免费在线 | 一本在线 | 国产情品| 国产日韩一区二区 | 成人av一区二区三区 | av在线电影网站 | 欧美三级在线 | 欧美aaaaa| 久久久成人网 | 暖暖成人免费视频 | www四虎com | 国外成人在线视频网站 | 欧美性猛交一区二区三区精品 | 97中文视频| 国产玖玖| 亚洲香蕉在线视频 | 全免费a级毛片免费看视频免 | 欧美一级免费黄色片 | 欧美午夜一区 | aaaaa毛片| 日韩中文字幕久久 | 国产一区二区影院 | 成人动慢 | 黄色一级毛片 | av乱码 | 国产成人免费视频网站高清观看视频 | 91伦理片| 黄色在线免费播放 | 亚洲精品久久久久久久久久久久久 |