开发指南—常见问题—扫描全部/部分分库分表-阿里云开发者社区

开发者社区> -技术小能手-> 正文

开发指南—常见问题—扫描全部/部分分库分表

简介: 本文介绍了扫描全部/部分分库分表的HINT语法和示例。
+关注继续查看

除了可以将SQL单独下发到一个或多个分库执行,PolarDB-X还提供了扫描全部/部分分库与分表的SCAN HINT。使用SCAN HINT,您可以一次将SQL下发到每一个分库执行, 比如查看某个分库上的所有分表,或者查看某个逻辑表的每张物理表中的数据量等。

通过SCAN HINT,可以指定四种执行SQL的方式:

  1. 在所有分库的所有分表上执行;
  2. 在指定分库的所有分表上执行;
  3. 在指定分库分表上执行,根据条件计算物理表名称;
  4. 在指定分库分表上执行,显式指定物理表名;

SCAN HINT支持 DML、DDL和部分DAL语句。

语法


# SCAN HINT
# 将SQL语句下发到所有分库的所有分表上执行
SCAN()                               
# 将SQL语句下发到指定分库的所有分表上执行
SCAN(NODE="node_list")               # 指定分库
# 将SQL语句下发到指定分库分表上执行,根据条件计算物理表名称
SCAN(
  [TABLE=]"table_name_list"          # 逻辑表名
  , CONDITION="condition_string"     # 使用TABLE和CONDITION中的内容计算物理库表名称
  [, NODE="node_list"] )             # 过滤通过CONDITION计算出的结果,仅保留指定物理库
# 将SQL语句下发到指定分库分表上执行,显式指定物理表名
SCAN(
  [TABLE=]"table_name_list"          # 逻辑表名
  , REAL_TABLE=("table_name_list")   # 物理表名,对所有物理库使用相同的物理表名
  [, NODE="node_list"] )             # 过滤通过CONDITION计算出的结果,仅保留指定物理库
# 物理/逻辑表名列表
table_name_list: 
    table_name [, table_name]...
# 物理库列表,支持GROUP_KEY和GROUP的序号, 可以通过`SHOW NODE`语句获得 
node_list: 
    {group_key | group_index} [, {group_key | group_index}]...
    
# 支持SQL WHERE的语法,需要为每一张表设置条件,如:t1.id = 2 and t2.id = 2
condition_string: 
    where_condition

注意事项

  • PolarDB-X自定义HINT支持/*+TDDL:hint_command*//!+TDDL:hint_command*/两种格式。
  • 如果使用/*+TDDL:hint_command*/格式,在使用MySQL官方命令行客户端执行带有PolarDB-X自定义HINT的SQL时,请在登录命令中加上-c 参数。否则,由于PolarDB-X自定义HINT是以MySQL 注释形式使用的,该客户端会将注释语句删除后再发送到服务端执行,导致PolarDB-X自定义HINT失效。具体请查看MySQL 官方客户端命令

示例

  • 在所有分库的所有分表上执行:
SELECT /*+TDDL:scan()*/ COUNT(1) FROM t1
  • 执行后会下发SQL语句到t1的所有物理表上执行,并将结果集合并后返回。
  • 在指定分库的所有分表上执行:
SELECT /*+TDDL:scan(node='0,1,2')*/ COUNT(1) FROM t1
  • 执行后会首先计算出t1在0000, 0001, 0002分库上的所有物理表,然后下发SQL语句并将结果集合并后返回。
  • 按条件在指定分表上执行:
SELECT /*+TDDL:scan('t1', condition='t1.id = 2')*/ COUNT(1) FROM t1
  • 执行后会首先计算出逻辑表t1满足condition条件的所有物理表,然后下发SQL语句并将结果集合并后返回。
  • 按条件在指定分表上执行,有JOIN的情况:
SELECT /*+TDDL:scan('t1, t2', condition='t1.id = 2 and t2.id = 2')*/ * FROM t1 a JOIN t2 b ON a.id = b.id WHERE b.name = "test"
  • 执行后会首先计算出逻辑表t1t2满足 condition 条件的所有物理表,然后下发 SQL 语句并将结果集合并后返回。 注意:使用该自定义注释需要保证两张表的分库和分表数量一致,否则PolarDB-X计算出的两个键值对应的分库不一致,就会报错。
  • 在指定分库分表上执行,显式指定物理表名:
SELECT /*+TDDL:scan('t1', real_table=("t1_00", "t1_01"))*/ COUNT(1) FROM t1
  • 执行后会下发SQL语句到所有分库的t1_00``t1_01分表上,合并结果集后返回。
  • 在指定分库分表上执行,显式指定物理表名, 有JOIN的情况:
SELECT /*+TDDL:scan('t1, t2', real_table=("t1_00,t2_00", "t1_01,t2_01"))*/ * FROM t1 a JOIN t2 b ON a.id = b.id WHERE b.name = "test";
  • 执行后会下发SQL语句到所有分库的t1_00t2_00t1_01t2_01分表上,合并结果集后返回。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Java 性能优化:35个小细节,让你提升Java代码运行的效率
  代码优化,一个很重要的课题。可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没用,但是,吃的小虾米一多之后,鲸鱼就被喂饱了。   代码优化也是一样,如果项目着眼于尽快无BUG上线,那么此时可以抓大放小,代码的细节可以不精打细磨;但是如果有足够的时间开发、维护代码,这时候就必须考虑每个可以优化的细节了,一个一个细小的优化点累积起来,对于代码的运行效率绝对是有提升的。
8 0
Java-Redis笔记
  Redis   1. 概念: redis是一款高性能的NOSQL系列的非关系型数据库   1.1.什么是NOSQL   NoSQL(NoSQL=Not Only SQL),意即“不仅仅是SQL”,是一项全新的数据库理念,泛指非关系型的数据库。   随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。
6 0
ADO.Net简介 140
  ADO.NET是.Net中一组类库,通过这组类库可以让我们通过程序的方式访问数据库中数据;之前学习的都是在数据库管理器中通过设计器或者SQL语句进行增删改查等操作数据库中的数据,对于普通用户不可能每个人都必须学习SQL,才能查看使用数据库,我们使用ADO.Net中的类库通过搭建比如窗体程序,使普通用户通过窗体上的按钮就可以很方便地操作和使用数据库中的数据,比如去买火车飞机等票时,窗口的出票员他们不可能每个人都去学习过SQL的知识后才能上岗,他们也是通过窗体或者网页方式查询使用数据库的数据的   ADO.NET中最重要的两个类:1)Connection用来连接数据库 2)Command用
6 0
Java高级软件工程师面试考纲
  如果要应聘高级开发工程师职务,仅仅懂得Java的基础知识是远远不够的,还必须懂得常用数据结构、算法、网络、操作系统等知识。因此本文不会讲解具体的技术,笔者综合自己应聘各大公司的经历,整理了一份大公司对Java高级开发工程师职位的考核纲要,希望可以帮助到需要的人。   当前,市面上有《Java XX宝典》类似的图书,而且图书中的内容都着重在讲解Java最为基础的部分,最严重的是,里面有着大量错误的内容,极具误导性。另外,网上也有各种各样的Java面试题,很多也是着重在Java语言基础上。实际上,如果要应聘高级开发工程师职务,仅仅懂得Java的基础知识是远远不
6 0
Apache Spark,Parquet和麻烦的Null
  关于类型安全性的经验教训,并承担过多   介绍   在将SQL分析ETL管道迁移到客户端的新Apache Spark批处理ETL基础结构时,我注意到了一些奇特的东西。 开发的基础结构具有可为空的DataFrame列架构的概念。 乍看起来似乎并不奇怪。 大多数(如果不是全部)SQL数据库都允许列为可空或不可空,对吗? 让我们研究一下在创建Spark DataFrame时,这种看似明智的概念为什么会带来问题。   from pyspark.sql import types   schema=types.StructType([
4 0
asp.net中引用与using的区别
  项目添加引用的目的是引入程序集   程序集的概念是什么?   程序集是一个 DLL,这是调用其中类的必备条件 一个程序集包括一个或多个命名空间 举例来说 命名空间 System.Data 来自文件 System.Data.DLL 命名空间 System.Data.SqlClient 同样来自 System.Data.DLL 那么意味着你一旦添加了 System.Data 程序集 文件的引用(无论你是从 GAC 添加还是直接添加的 DLL 到项目) 你就可以使用 System.Data 和 System.Data.SqlClient 下的各种类   为什么要 using 呢?
6 0
C#将本地图片转换成二进制
  C#有很多种上传图片的方式,今天介绍一种将本地图片转换成二进制保存到数据库的方式。   一、将图片转换成二进制工具   ///   /// 将本地图片转换成二进制   ///   ///   ///   public static Byte[] GetContent(string filepath)
5 0
BS与CS的联系和差异
  一、什么是CS?   CS(Client/Server):客户端----服务器结构。它的主要特点是交互性强、具有安全的存取模式、网络通信量低、响应速度快、利于处理大量数据。因为客户端要负责绝大多数的业务逻辑和UI展示,又称为胖客户端。它充分利用两端硬件,将任务分配到Client 和Server两端,降低了系统的通讯开销。   C/S结构的软件需要针对不同的操作系统系统开发不同版本的软件,加之产品的更新换代十分快,已经很难适应百台电脑以上局域网用户同时使用。   C/S 架构是一种典型的两层架构,其客户端包含一个或多个在用户的电脑上运行的程序,而服务器端有两种,一种是数据库服务器端,客
8 0
C#之数据库操作类
  平时在进行C#开发时,需要对数据库进行操作,下面介绍几种常见的操作数据库的方法:   一、操作类DataAccess   using System;   using System.Collections.Generic;   using System.Linq;   using System.Text;   using System.Data;   using System.Data.SqlClient;   using DevExpress.XtraEditors;   using System.Windows.Forms;   //自己写的解密数据库链接dll,可
5 0
C#如何将数据库的二进制图片显示出来
  将图片以二进制流的方式存到数据库后,在进行查询或者修改的时候需要展示出来,下面介绍一种展示方式。   一、查询方法   ///   /// 获取图片二进制流   ///   ///   ///   ///   public Image GetImageBySql(string CmdText, String filed)
4 0
1280
文章
0
问答
来源圈子
更多
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载