SQL跨表查询

article/2025/8/18 10:16:06

目录

前言

方案一:连接多个库,同步执行查询

优点

缺点

代码执行

方案二:在主数据库增加冗余表,通过定时更新,造成同库联表查询

优点

缺点

相似实现场景

方案三:(极度不建议)dbLink本地连接多个库,在本地进行数据分析

优点

缺点


前言

我们知道mysql是不支持跨库连接的,但是老话说得好,只要思想不滑坡,思想总比困难多!

进行sql的跨库关联查询?

问题摆在这里了,还能不解决是怎么的?

本人连接方案,以postgreSql库为例。

方案一:连接多个库,同步执行查询

具体思路为在代码中分别连接多个库,查到一个库中所需要的数据之后,通过关键字段,同步执行去其他的库中进行查询相关数据,然后进行需要的数据分析或更新!

优点

  • 可以进行实时查询;
  • 可对数据进行按需修改及逻辑范围内的修改返回值;
  • 一般采用此方案,查询数据会分页查询,或查询条件精确,从而量会比较小,对服务器压力小;
  • 服务器静态分析数据,效率高;

缺点

  • 不适合进行大批数据写入/查询,会造成数据库连接超时或获取的数据流过大导致服务器内存被大量占用;
  • 同步执行策略,查询数据库用时和运行时间成正比;

代码执行

postgreSql.js

//链接多个数据库,并暴露
const pg = require('pg');
const sqlConfig = {testOnePgSql: {user: "postgres",database: "admindb",password: "123",host: "192.168.1.111",//数据库ip地址(胡乱写的,写自己的库ip哈)port: 5432, // 扩展属性max: 20, // 连接池最大连接数idleTimeoutMillis: 3000},testTwoPgSql: {//测试数据库user: "postgres",database: "admindb",password: "123",host: "192.168.1.112",//数据库ip地址(胡乱写的,写自己的库ip哈)port: 5432, // 扩展属性max: 20, // 连接池最大连接数idleTimeoutMillis: 3000},testThreePgSql: {//测试数据库user: "postgres",database: "admindb",password: "123",host: "192.168.1.113",//数据库ip地址(胡乱写的,写自己的库ip哈)port: 5432, // 扩展属性max: 20, // 连接池最大连接数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数据* @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) {// 结束会话connection.release();return reject(err);}let result = await pgQuery(sqlSelect, connection);// 结束会话connection.release();return resolve(result);});});}};/*** pgsql查询数据* @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 || []);});});
}

现在进行业务模块

test.js

"use strict";
//引入pg函数
let PGSQL = require("./postgreSqlClass");exports.getUserList = async () => {let sqlOneSelect = `${第一个表查询语句}`;let userList = await PGSQL.select(sqlSelect, "testOnePgSql");//获取对应two表的数据//...逻辑let sqlTwoSelect = `${第一个表查询语句}`;let userListTwo = await PGSQL.select(sqlTwoSelect, "testTwoPgSql");let result = [];//组合你想要的数据//...逻辑return result;
};

方案二:在主数据库增加冗余表,通过定时更新,造成同库联表查询

比如A库为主数据库,B、C为其他的增项库,我们需要将三个库中的user表进行数据联表查询; 具体思路为:

  • 在A库存在user表,此时创建冗余表user_two、user_three表,并字段对应B、C库的user表字段;
  • 通过代码逻辑,进行定时任务,将B、C表,数据更新至A库user_two、user_three表;
  • 在需要数据分析/查询时,仅查询A库即可,但需要将A库的user、user_two、user_three表进行按需取用;

优点

  • 化跨表查询为同表查询,执行逻辑更为简单;
  • 可进行大数据分析和大数据查询;
  • 可以预处理数据,提高分析速率;

缺点

  • 定时更新,不具备及时性;
  • 需要对应表有最后更新时间字段,否则同步数据会比较多;
  • 增加冗余表,会造成主表空间占用率增加;
  • 定时更新,会导致某一时间点有大量数据写入/修改数据,可能会影响数据读取,因此,建议多节点部署(读写、只读);

相似实现场景

  • T+1时间的报表展示;
  • 局域网本地数据库信息上报至线上数据库;

方案三:(极度不建议)dbLink本地连接多个库,在本地进行数据分析

具体思路:

  • dblink就是我们在创建表的时候连接到我们的远程库,然后我们本地新建的表数据就是映射远程的表的数据。
  • 当我们创建一个以FEDERATED为存储引擎的表时,服务器在数据库目录只创建一个表定义文件。文件由表的名字开始,并有一个frm扩展名。无其它文件被创建,因为实际的数据在一个远程数据库上。这不同于为本地表工作的存储引擎的方式。

执行步骤:

  • 1.如我现在本地要连接我的阿里云的sys_user表,所以我需要在本地建一个相同字段的表,我取名叫sys_user_copy,并连接到远程库,建好后,我本地sys_user_copy的表里面的数据是映射远程的表的数据

2.所以我关联查询,可以直接关联我本地sys_user_copy表从而查出来。改了本地的数据,远程的表数据也会跟着变

 

**开启FEDERATED引擎,**show engines

 

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

 

改完重启服务,就变成yes了。

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

 

优点

  • 不需要程序员介入,不需要开发
  • 快速形成结果,如果只想查询一些数据的话

缺点

  • 本地表结构必须与远程表完全一样
  • 不支持事务
  • 不支持表结构修改
  • 删除本地表,远程表不会删除
  • 远程服务器必须是一个MySQL服务器
  • 并不会在本地写入数据库数据,实质上是一个软连接,查询大量数据会导致本地内存爆满,因为是查询多个数据库的数据到本地内存,然后在内存中进行计算,此时时间复杂度为O(N^2),空间复杂度也为O(N^2);500条数据,对应本地时间复杂度为25W,时间复杂度为25W;

可用于:两库之间数据导入,不涉及计算,即A导入B,不进行查询A\B进行计算写入C;

 


http://chatgpt.dhexx.cn/article/8v4xePRM.shtml

相关文章

跨库查询和多表查询

介绍如何使用MySQL进行跨库查询和多表查询&#xff08;几张表的信息纵向连接在一张表中&#xff09; information_schema MySQL内部使用的数据库 information_schema 和 mysql information_schema库保存了当前使用的MySQL的所有数据库&#xff0c;表信息&#xff0c;将这些信息…

Mysql不同服务器跨库查询解决方案

项目场景&#xff1a; Mysql在不同服务器实现跨库查询&#xff0c;类似dblink。 解决方案&#xff1a; 在两台不同服务器&#xff0c;实现跨库查询&#xff0c;其实现原理类似一个虚拟映射,需要用到mysql的另一个存储引擎Federated&#xff0c;FEDERATED存储引擎访问在远程数据…

Mysql跨库跨表联表查询

Mysql跨库跨表联表查询 查询两个库中两个表中的关联数据&#xff0c;如下图中&#xff0c;查询数据库dept中表dept和数据库emp中的表emp中关联的数据 SQL语句格式 SELECT * FROM 数据库1.表1,数据库2.表2 where 条件&#xff1b; select * from emp.emp a,dept.dept b where a.…

两不同服务器上的mysql跨库查询

业务场景&#xff1a;关联不同数据库中的表的查询 比如说&#xff0c;要关联的表是&#xff1a;机器A上的数据库A中的表A && 机器B上的数据库B中的表B。 这种情况下&#xff0c;想执行“select A.id,B.id from A left join B on ~~~;“那是不可能的&#xff0c;但业务需…

MySQL实现跨库join查询

MySQL实现跨库join查询 一.同服务器的不同库 只需要在表名前加上db_name select* fromuserdb.user u join orderdb.order o onu.id o.user_id;二.不同服务器的不同库 查看配置 FEDERATED SHOW engines;如果是NO,需要改为YES.默认是NO 在my.ini文件中增加一行&#xff0c;…

mysql怎么跨库查询_在MySQL中怎样进行跨库查询?

在MySQL中跨库查询主要分为两种情况&#xff0c;一种是同服务的跨库查询;另一种是不同服务的跨库查询;它们进行跨库查询是不同的&#xff0c;下面就具体介绍这两种跨库查询。 一、同服务的跨库查询 同服务的跨库查询只需要在关联查询的时候带上数据名&#xff0c;SQL的写法是这…

MySQL不同数据库不同表连表查询(跨库连表查询)

前提&#xff1a;文章为解决同一个连接不同数据库的表进行关联查询&#xff0c;本文以left join做示例其他的按照同样方法自己测试&#xff01; 首先拿到这个表&#xff0c;简称表A吧&#xff0c; 表A在A数据库 然后这个是表B 表B在B数据库 红线框的看不懂的去重新学一下数…

navicat跨库查询

利用navicat进行跨库查询&#xff08;2019 年 6 月 4 日&#xff0c;由 Robert Gravelle 撰写转载&#xff09; 随着主从&#xff08;Master-Slave&#xff09;拓扑和数据库分片等现代实践变得越来越普遍&#xff0c;数据库管理员&#xff08;DBA&#xff09;和开发人员比以往更…

(Mysql)跨表查询和跨库查询

新建测试数据库&#xff1a;create database test_cour; 选择数据库&#xff1a;use 数据库名&#xff1b; 查看数据表&#xff1a;show tables; 创建数据表里面的字段&#xff08;列&#xff09;名&#xff1a; create table 表名( //列名 字符格式 约束 //注意末尾加逗号&…

在MySQL中怎样进行跨库查询?

在MySQL中跨库查询主要分为两种情况&#xff0c;一种是同服务的跨库查询&#xff1b;另一种是不同服务的跨库查询&#xff1b;它们进行跨库查询是不同的&#xff0c;下面就具体介绍这两种跨库查询。 一、同服务的跨库查询 同服务的跨库查询只需要在关联查询的时候带上数据名&…

mysql中的跨库关联查询

业务场景&#xff1a;关联不同数据库中的表的查询 比如说&#xff0c;要关联的表是&#xff1a;机器A上的数据库A中的表A && 机器B上的数据库B中的表B。 这种情况下&#xff0c;想执行“select A.id,B.id from A left join B on ~~~;“那是不可能的&#xff0c;但业务…

mysql远程跨库联合查询

注意:myemployees库和shoppingCart库在同一台物理主机&#xff0c;如果不在同一台物理主机该怎么办呢&#xff1f;下面我会介绍到。 情况一2个库在同一台物理主机 联合查询(不同的2个库,myemployees库和shoppingCart库)&#xff0c;这2个库在同一台物理主机上&#xff0c;都在…

mysql跨库关联查询(dblink)

dblink 1、解决方案2、操作3、缺点 1、解决方案 mysql是不支持跨库连接的&#xff0c;如果我们实在要连接的话可以用dblink方式。 解释&#xff1a; dblink就是我们在创建表的时候连接到我们的远程库&#xff0c;然后我们本地新建的表数据就是映射远程的表的数据。当我们创建…

mysql跨库查询解决方案

1.第一种跨库查询&#xff0c;是在同一个mysql服务器下两个不同的数据库之间的联查&#xff0c;关系如下图 在同一个mysql服务器下&#xff0c;不同的两个数据直接加上库名就可以实现跨库查询了 select * from t_test1 t1, test2.t_test2 t2 where t1.id t2.id执行sql查询到…

MySQL跨库查询

一、跨库查询介绍 在MySQL中跨库查询主要分为两种情况&#xff0c;一种是同服务器的跨库查询&#xff1b;另一种是不同服务器的跨库查询&#xff1b;它们进行跨库查询是不同的&#xff0c;下面就具体介绍这两种跨库查询。 二、同服务器的跨库查询 同服务器的跨库查询只需要在关…

xampp v3.2.2 php版本,XAMPP(php集成环境包)

XAMPP(php集成环境包)是一款功能强大的PHP环境搭建工具&#xff0c;能够帮助用户在创建PHP环境的时候更加容易&#xff0c;简化了开发环境的配置流程&#xff0c;节约了PHP研发人员的时间。 【集成配置】 Apache 2.4.12 (VC11) (IPv6 Crypto apr-1.5.1 apr-util-1.5.4 apr-ico…

php一键安装包winnt,(推荐)Windows一键安装包安装

为了简化大家在windows下面的安装&#xff0c;我们在xampp基础上做了禅道企业版的windows一键安装包。 xampp是业内非常著名的AMP集成运行环境。禅道企业版的一键安装包主要在它基础上做了大量的精简&#xff0c;并集成了我们自主开发的控制面板&#xff0c;使用起来会更加方便…

windows下常见php集成环境安装包介绍

来源&#xff1a;http://aiyooyoo.com/index.php/archives/90 WAMP是指在Windows服务器上使用Apache、MySQL和PHP的集成安装环境&#xff0c;可以快速安装配置Web服务器&#xff0c;一 般说来&#xff0c;大家都习惯于将Apache、MySQL、PHP架设在Linux系统下&#xff0c;但是&a…

xammp php环境搭,XAMPP配置PHP环境搭建建站集成安装包7.2.4.4官方32位/64位版

XAMPP配置PHP环境搭建建站集成安装包官方最新版下载&#xff0c;XAMPP安装PHP环境搭建是小编为大家带来的一款功能强大的PHP建站集成软件包&#xff0c;Xampps工具能够让用户快速创建php环境&#xff0c;一键之下完成apache&#xff0c;php&#xff0c;mysql&#xff0c;phpmya…

php和nginx环境的配置,Nginx和PHP服务器环境的简单安装配置步骤

测试环境 Linux 2.6.18 nginx-1.0.4 http://www.nginx.org/ php-5.3.6 http://www.php.net/ 一&#xff0c;安装Nginx wget http://nginx.org/download/nginx-1.0.4.tar.gz tar -zxvf nginx-1.0.4.tar.gz cd nginx-1.0.4 ./configure --prefix/data/apps/nginx-1.0.4 make &…