最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

sql跨表查詢的三種方案總結(jié)

 更新時間:2022年08月11日 10:58:37   作者:乾復道  
這篇文章主要介紹了sql跨表查詢的三種方案總結(jié),文章圍繞主題展開詳細的內(nèi)容,具有一定的參考價值,需要的小伙伴可以參考一下,希望對你的學習有所幫助

前言

最近又個朋友問我,如何進行sql的跨庫關(guān)聯(lián)查詢? 首先呢,我們知道m(xù)ysql是不支持跨庫連接的,但是老話說得好,只要思想不滑坡,思想總比困難多!

PS: 問題擺在這里了,還能不解決是怎么的?

經(jīng)過一番思考我給他提出了三個方案,雖然都不盡善盡美,但各領(lǐng)風騷!

連接方案,以postgreSql庫為例。

方案一:連接多個庫,同步執(zhí)行查詢

具體思路為在代碼中分別連接多個庫,查到一個庫中所需要的數(shù)據(jù)之后,通過關(guān)鍵字段,同步執(zhí)行去其他的庫中進行查詢相關(guān)數(shù)據(jù),然后進行需要的數(shù)據(jù)分析或更新!

優(yōu)點

  • 可以進行實時查詢;
  • 可對數(shù)據(jù)進行按需修改及邏輯范圍內(nèi)的修改返回值;
  • 一般采用此方案,查詢數(shù)據(jù)會分頁查詢,或查詢條件精確,從而量會比較小,對服務器壓力??;
  • 服務器靜態(tài)分析數(shù)據(jù),效率高;

缺點

  • 不適合進行大批數(shù)據(jù)寫入/查詢,會造成數(shù)據(jù)庫連接超時或獲取的數(shù)據(jù)流過大導致服務器內(nèi)存被大量占用;
  • 同步執(zhí)行策略,查詢數(shù)據(jù)庫用時和運行時間成正比;

代碼執(zhí)行

一些簡單的代碼邏輯,不會有人看不懂吧~~~

postgreSql.js

//鏈接多個數(shù)據(jù)庫,并暴露
const pg = require('pg');
const sqlConfig = {
  testOnePgSql: {
    user: "postgres",
    database: "admindb",
    password: "123",
    host: "192.168.1.111",//數(shù)據(jù)庫ip地址(胡亂寫的,寫自己的庫ip哈)
    port: 5432, // 擴展屬性
    max: 20, // 連接池最大連接數(shù)
    idleTimeoutMillis: 3000
  },
  //超島商戶
  testTwoPgSql: {
    //測試數(shù)據(jù)庫
    user: "postgres",
    database: "admindb",
    password: "123",
    host: "192.168.1.112",//數(shù)據(jù)庫ip地址(胡亂寫的,寫自己的庫ip哈)
    port: 5432, // 擴展屬性
    max: 20, // 連接池最大連接數(shù)
    idleTimeoutMillis: 3000
  },
  //桃娘商戶
  testThreePgSql: {
    //測試數(shù)據(jù)庫
    user: "postgres",
    database: "admindb",
    password: "123",
    host: "192.168.1.113",//數(shù)據(jù)庫ip地址(胡亂寫的,寫自己的庫ip哈)
    port: 5432, // 擴展屬性
    max: 20, // 連接池最大連接數(shù)
    idleTimeoutMillis: 3000
  },
};
const testOnePgSql = new pg.Pool(sqlConfig.banuPgSql);
const testTwoPgSql = new pg.Pool(sqlConfig.testTwoPgSql);
const testThreePgSql = new pg.Pool(sqlConfig.testThreePgSql);
module.exports = {
  testOnePgSql,
  testTwoPgSql,
  testThreePgSql
};

封裝查詢pgsql方法

postgreSqlClass.js

let sqlMap = require('./postgreSql');
module.exports = {
  /**
   *查詢pgsql數(shù)據(jù)
   * @param sqlSelect 查詢語句 string
   * @param tenancy 商戶id string
   */
  select(sqlSelect, tenancy) {
    //按需連接
    let pool = sqlMap[tenancy];
    return new Promise((resolve, reject) => {
      pool.connect(async function (err, connection) {
        if (err) {
          // 結(jié)束會話
          connection.release();
          return reject(err);
        }
        let result = await pgQuery(sqlSelect, connection);
        // 結(jié)束會話
        connection.release();
        return resolve(result);
      });
    });
  }

};
/**
 * pgsql查詢數(shù)據(jù)
 * @param sqlQuery 查詢語句
 * @param connection pgSql連接后的connection
 * @returns {Promise<unknown>}
 */
async function pgQuery(sqlQuery, connection) {
  return new Promise((resolve, reject) => {
    connection.query(sqlQuery, (err, rows) => {
      if (err) return reject(err);
      return resolve(rows.rows || []);
    });
  });
}

現(xiàn)在進行業(yè)務模塊

test.js

  "use strict";
//引入pg函數(shù)
let PGSQL = require("./postgreSqlClass");
exports.getUserList = async () => {

  let sqlOneSelect = `${第一個表查詢語句}`;
  let userList = await PGSQL.select(sqlSelect, "testOnePgSql");
  //獲取對應two表的數(shù)據(jù)
  //...邏輯

  let sqlTwoSelect = `${第一個表查詢語句}`;
  let userListTwo = await PGSQL.select(sqlTwoSelect, "testTwoPgSql");
  let result = [];
  //組合你想要的數(shù)據(jù)
  //...邏輯

  return result;
};

方案二:在主數(shù)據(jù)庫增加冗余表,通過定時更新,造成同庫聯(lián)表查詢

比如A庫為主數(shù)據(jù)庫,B、C為其他的增項庫,我們需要將三個庫中的user表進行數(shù)據(jù)聯(lián)表查詢; 具體思路為:

  • 在A庫存在user表,此時創(chuàng)建冗余表user_two、user_three表,并字段對應B、C庫的user表字段;
  • 通過代碼邏輯,進行定時任務,將B、C表,數(shù)據(jù)更新至A庫user_two、user_three表;
  • 在需要數(shù)據(jù)分析/查詢時,僅查詢A庫即可,但需要將A庫的user、user_two、user_three表進行按需取用;

優(yōu)點

  • 化跨表查詢?yōu)橥聿樵?,?zhí)行邏輯更為簡單;
  • 可進行大數(shù)據(jù)分析和大數(shù)據(jù)查詢;
  • 可以預處理數(shù)據(jù),提高分析速率;

缺點

  • 定時更新,不具備及時性;
  • 需要對應表有最后更新時間字段,否則同步數(shù)據(jù)會比較多;
  • 增加冗余表,會造成主表空間占用率增加;
  • 定時更新,會導致某一時間點有大量數(shù)據(jù)寫入/修改數(shù)據(jù),可能會影響數(shù)據(jù)讀取,因此,建議多節(jié)點部署(讀寫、只讀);

相似實現(xiàn)場景

  • T+1時間的報表展示;
  • 局域網(wǎng)本地數(shù)據(jù)庫信息上報至線上數(shù)據(jù)庫;

方案三:dbLink本地連接多個庫,在本地進行數(shù)據(jù)分析

(極度不建議)

具體思路:

  • dblink就是我們在創(chuàng)建表的時候連接到我們的遠程庫,然后我們本地新建的表數(shù)據(jù)就是映射遠程的表的數(shù)據(jù)。
  • 當我們創(chuàng)建一個以FEDERATED為存儲引擎的表時,服務器在數(shù)據(jù)庫目錄只創(chuàng)建一個表定義文件。文件由表的名字開始,并有一個frm擴展名。無其它文件被創(chuàng)建,因為實際的數(shù)據(jù)在一個遠程數(shù)據(jù)庫上。這不同于為本地表工作的存儲引擎的方式。

執(zhí)行步驟:

  • 1.如我現(xiàn)在本地要連接我的阿里云的sys_user表,所以我需要在本地建一個相同字段的表,我取名叫sys_user_copy,并連接到遠程庫,建好后,我本地sys_user_copy的表里面的數(shù)據(jù)是映射遠程的表的數(shù)據(jù)

  • 2.所以我關(guān)聯(lián)查詢,可以直接關(guān)聯(lián)我本地sys_user_copy表從而查出來。改了本地的數(shù)據(jù),遠程的表數(shù)據(jù)也會跟著變

**開啟FEDERATED引擎,**show engines

 如果這里是NO,需要在配置文件[mysqld]中加入一行:federated 

改完重啟服務,就變成yes了。

  • 4 建表時加上連接

CREATE TABLE (......)
ENGINE =FEDERATED CONNECTION='mysql://username:password@hostname:port/database/tablename'

優(yōu)點

  • 不需要程序員介入,不需要開發(fā)
  • 快速形成結(jié)果,如果只想查詢一些數(shù)據(jù)的話

缺點

  • 本地表結(jié)構(gòu)必須與遠程表完全一樣
  • 不支持事務
  • 不支持表結(jié)構(gòu)修改
  • 刪除本地表,遠程表不會刪除
  • 遠程服務器必須是一個MySQL服務器
  • 并不會在本地寫入數(shù)據(jù)庫數(shù)據(jù),實質(zhì)上是一個軟連接,查詢大量數(shù)據(jù)會導致本地內(nèi)存爆滿,因為是查詢多個數(shù)據(jù)庫的數(shù)據(jù)到本地內(nèi)存,然后在內(nèi)存中進行計算,此時時間復雜度為O(N^2),空間復雜度也為O(N^2);500條數(shù)據(jù),對應本地時間復雜度為25W,時間復雜度為25W;

可用于:兩庫之間數(shù)據(jù)導入,不涉及計算,即A導入B,不進行查詢A\B進行計算寫入C;

到此這篇關(guān)于sql跨表查詢的三種方案總結(jié)的文章就介紹到這了,更多相關(guān)sql跨表查詢 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL 8.0.18 Hash Join不支持left/right join左右連接問題

    MySQL 8.0.18 Hash Join不支持left/right join左右連接問題

    在MySQL 8.0.18中,增加了Hash Join新功能,它適用于未創(chuàng)建索引的字段,做等值關(guān)聯(lián)查詢。這篇文章給大家介紹MySQL 8.0.18 Hash Join不支持left/right join左右連接,感興趣的朋友一起看看吧
    2019-11-11
  • MySQL中刪除重復數(shù)據(jù)SQL的三種寫法

    MySQL中刪除重復數(shù)據(jù)SQL的三種寫法

    這篇文章主要介紹了MySQL中刪除重復數(shù)據(jù)SQL的三種寫法,文中通過代碼示例講解的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下
    2025-01-01
  • MySQL select查詢之LIKE與通配符用法

    MySQL select查詢之LIKE與通配符用法

    這篇文章主要介紹了MySQL select查詢之LIKE與通配符用法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • MySQL基礎之MySQL 5.7 新增配置

    MySQL基礎之MySQL 5.7 新增配置

    mysql數(shù)據(jù)庫性能非常高,運行速度非??欤酉聛硗ㄟ^本文給大家介紹MySQL 5.7 新增配置,非常不錯,具有參考借鑒價值,感興趣的朋友一起看看吧
    2016-09-09
  • MySQL約束與索引概念詳解

    MySQL約束與索引概念詳解

    約束是用來對數(shù)據(jù)業(yè)務規(guī)則和數(shù)據(jù)完整性進行實施、維護。約束的作用范圍僅限在當前數(shù)據(jù)庫,約束可以被當做數(shù)據(jù)庫對象來處理,它們具有名稱和關(guān)聯(lián)模式,是邏輯約束,不會因為設置約束而額外占用空間
    2023-04-04
  • SQLyog連接MySQL8.0+報錯:錯誤號碼2058的解決方案

    SQLyog連接MySQL8.0+報錯:錯誤號碼2058的解決方案

    本文將總結(jié)如何解決 SQLyog 連接 MySQL8.0+ 時報錯:錯誤號碼2058,文中通過圖文結(jié)合和代碼示例給大家總結(jié)了三種解決方案,具有一定的參考價值,需要的朋友可以參考下
    2023-12-12
  • 基于Php mysql存儲過程的詳解

    基于Php mysql存儲過程的詳解

    本篇文章是對Php中的mysql存儲過程進行了詳細的分析介紹,需要的朋友參考下
    2013-06-06
  • MySQL避免插入重復記錄的方法

    MySQL避免插入重復記錄的方法

    這篇文章主要介紹了MySQL避免插入重復記錄的方法,需要的朋友可以參考下
    2023-10-10
  • 淺析mysql 共享表空間與獨享表空間以及他們之間的轉(zhuǎn)化

    淺析mysql 共享表空間與獨享表空間以及他們之間的轉(zhuǎn)化

    本篇文章是對mysql 共享表空間與獨享表空間以及他們之間的轉(zhuǎn)化進行了詳細的分析介紹,需要的朋友參考下
    2013-06-06
  • 解析mysql中的auto_increment的問題

    解析mysql中的auto_increment的問題

    本篇文章是對mysql中的auto_increment的問題進行了詳細的分析介紹,需要的朋友參考下
    2013-06-06

最新評論

尉氏县| 兴隆县| 元朗区| 凤庆县| 湾仔区| 昌宁县| 岑溪市| 巴塘县| 巴塘县| 凤台县| 河东区| 柏乡县| 济阳县| 叶城县| 浦北县| 平安县| 红原县| 翁牛特旗| 新巴尔虎左旗| 工布江达县| 桑植县| 巴青县| 哈巴河县| 大悟县| 冕宁县| 志丹县| 城步| 延庆县| 凤阳县| 道孚县| 墨竹工卡县| 五常市| 东平县| 汨罗市| 常山县| 包头市| 资阳市| 盖州市| 商洛市| 那坡县| 邢台市|