043、TiDB特性_缓存表和分区表

news2025/1/18 11:45:13

针对于优化器在索引存在时依然使⽤全表扫描的情况下,使⽤缓存表和分区表是提升查询性能的有效⼿段。
在这里插入图片描述

缓存表

  • 缓存表是将表的内容完全缓存到 TiDB Server 的内存中
  • 表的数据量不⼤,⼏乎不更改
  • 读取很频繁
  • 缓存控制: ALTER TABLE table_name CACHE|NOCACHE;
# 使用trace跟踪下
tidb> TRACE SELECT * FROM test.c1;
+-------------------------------------------+-----------------+---
---------+
| operation | startTS |
duration |
+-------------------------------------------+-----------------+---
---------+
| trace | 18:39:25.485266 |
501.582µs |
| ├─session.ExecuteStmt | 18:39:25.485270 |
432.208µs |
| │ ├─executor.Compile | 18:39:25.485281 |
132.616µs |
| │ └─session.runStmt | 18:39:25.485433 |
249.488µs |
| │ └─UnionScanExec.Open | 18:39:25.485572 |
72.776µs |
| │ ├─TableReaderExecutor.Open | 18:39:25.485575 |
13.24µs |
| │ ├─buildMemTableReader | 18:39:25.485605 |
3.283µs |
| │ └─memTableReader.getMemRows | 18:39:25.485615 |   # memTableReader.getMemRows 表示从缓存取数
20.558µs |
| ├─*executor.ProjectionExec.Next | 18:39:25.485712 |
12.911µs |
| │ └─*executor.UnionScanExec.Next | 18:39:25.485714 |
3.823µs |
| └─*executor.ProjectionExec.Next | 18:39:25.485733 |
8.943µs |
| └─*executor.UnionScanExec.Next | 18:39:25.485735 |
1.33µs |
+-------------------------------------------+-----------------+---
---------+
12 rows in set (0.00 sec)

小表缓存-原理

在这里插入图片描述

缓存租约

  • 租约时间内,无法进行写操作
    在这里插入图片描述

  • 租约到期,数据过期

  • 写操作不再被阻塞

  • 读写直接到TiKV节点上执行
    在这里插入图片描述

  • 数据更新完毕,租约继续开启

在这里插入图片描述

应用场景

  • 每张缓存表的大小限制为64MB
  • 适用于查询频繁、数据量不大、修改极少的场景
  • 在租约(tidb_table_cache_lease) 时间内,写操作会被阻塞
  • 当租约到期(tidb_table_cache_lease)时,读性能会下降
  • 不支持对缓存表直接做DDL操作,需要先关闭
  • 对于表加载较慢或者极少修改的表,可以适当延长tidb_table_cache_lease保持读性能稳定

分区表

分区类型与适用场景

  • range: 分区剪裁,节省IO开销
  • Hash: 用于大规模写入的情况下将数据打散,平均地分配到各个分区里
Range分区表
create table t1(x int) partition by name(x) (
partition p0 values less than(5),
partition p1 values less than (10));
)

分区类型与适⽤场景

  • Range

分区裁剪, 节省 I/O 开销

/* Range Partition t1 */
drop table if exists test.t1;
create table test.t1 (x int) partition by range (x) (
 partition p0 values less than (5),
 partition p1 values less than (10));
insert into test.t1 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
insert into test.t1 select * from test.t1;
insert into test.t1 select * from test.t1;
insert into test.t1 select * from test.t1;
insert into test.t1 select * from test.t1;
insert into test.t1 select * from test.t1;
insert into test.t1 select * from test.t1;
insert into test.t1 select * from test.t1;
insert into test.t1 select * from test.t1;
insert into test.t1 select * from test.t1;
insert into test.t1 select * from test.t1;
insert into test.t1 select * from test.t1;
insert into test.t1 select * from test.t1;
insert into test.t1 select * from test.t1;
insert into test.t1 select * from test.t1;
insert into test.t1 select * from test.t1;
insert into test.t1 select * from test.t1;
insert into test.t1 select * from test.t1;
insert into test.t1 select * from test.t1;
/* Check Partition Pruning */
explain select * from test.t1 where x between 1 and 4;

查看执行计划
mysql> explain select * from test.t1 where x between 1 and 4;
+-------------------------+-----------+-----------+------------------------+------------------------------------+
| id                      | estRows   | task      | access object          | operator info                      |
+-------------------------+-----------+-----------+------------------------+------------------------------------+
| TableReader_9           | 12288.00  | root      |                        | data:Selection_8                   |
| └─Selection_8           | 12288.00  | cop[tikv] |                        | ge(test.t1.x, 1), le(test.t1.x, 4) |
|   └─TableFullScan_7     | 491520.00 | cop[tikv] | table:t1, partition:p0 | keep order:false                   |
+-------------------------+-----------+-----------+------------------------+------------------------------------+
3 rows in set (0.03 sec)
/* Check regions */
show table test.t1 regions;
mysql> show table test.t1 regions;
+-----------+-----------+---------+-----------+-----------------+-------+------------+---------------+------------+----------------------+------------------+
| REGION_ID | START_KEY | END_KEY | LEADER_ID | LEADER_STORE_ID | PEERS | SCATTERING | WRITTEN_BYTES | READ_BYTES | APPROXIMATE_SIZE(MB) | APPROXIMATE_KEYS |
+-----------+-----------+---------+-----------+-----------------+-------+------------+---------------+------------+----------------------+------------------+
|      5019 | t_79_     | t_80_   |      5020 |            1001 | 5020  |          0 |             0 |          0 |                   67 |           877551 |
|      1002 | t_80_     |         |      1003 |            1001 | 1003  |          0 |             0 |          0 |                   24 |           421921 |
+-----------+-----------+---------+-----------+-----------------+-------+------------+---------------+------------+----------------------+------------------+
2 rows in set (0.02 sec)
  • Hash

可以⽤于⼤规模写⼊的情况下将数据打散, 平均地分配到各个分区⾥

/* Hash Partition t1 */
drop table if exists test.t1;
CREATE TABLE test.t1 (x INT)
 PARTITION BY HASH(x)
 PARTITIONS 4;

insert into test.t1 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
insert into test.t1 select * from test.t1;
insert into test.t1 select * from test.t1;
insert into test.t1 select * from test.t1;
insert into test.t1 select * from test.t1;
insert into test.t1 select * from test.t1;
insert into test.t1 select * from test.t1;
insert into test.t1 select * from test.t1;
insert into test.t1 select * from test.t1;
insert into test.t1 select * from test.t1;
insert into test.t1 select * from test.t1;
insert into test.t1 select * from test.t1;
insert into test.t1 select * from test.t1;
insert into test.t1 select * from test.t1;
insert into test.t1 select * from test.t1;
insert into test.t1 select * from test.t1;
insert into test.t1 select * from test.t1;
insert into test.t1 select * from test.t1;
insert into test.t1 select * from test.t1;

查看分区的执行计划

  • 默认是通过mod方式分配分区
/* Check Partition Distribution */

explain select * from test.t1 where x=0;
explain select * from test.t1 where x=1;
explain select * from test.t1 where x=2;
explain select * from test.t1 where x=3;
explain select * from test.t1 where x=4;
explain select * from test.t1 where x=5;
explain select * from test.t1 where x=6;
explain select * from test.t1 where x=7;
explain select * from test.t1 where x=8;
explain select * from test.t1 where x=9;
/* Negative */
explain select * from test.t1 where x between 7 and 9;
mysql> explain select * from test.t1 where x between 7 and 9;
+------------------------------+----------+-----------+------------------------+------------------------------------+
| id                           | estRows  | task      | access object          | operator info                      |
+------------------------------+----------+-----------+------------------------+------------------------------------+
| PartitionUnion_10            | 750.00   | root      |                        |                                    |
| ├─TableReader_13             | 250.00   | root      |                        | data:Selection_12                  |
| │ └─Selection_12             | 250.00   | cop[tikv] |                        | ge(test.t1.x, 7), le(test.t1.x, 9) |
| │   └─TableFullScan_11       | 10000.00 | cop[tikv] | table:t1, partition:p0 | keep order:false, stats:pseudo     |
| ├─TableReader_16             | 250.00   | root      |                        | data:Selection_15                  |
| │ └─Selection_15             | 250.00   | cop[tikv] |                        | ge(test.t1.x, 7), le(test.t1.x, 9) |
| │   └─TableFullScan_14       | 10000.00 | cop[tikv] | table:t1, partition:p1 | keep order:false, stats:pseudo     |
| └─TableReader_19             | 250.00   | root      |                        | data:Selection_18                  |
|   └─Selection_18             | 250.00   | cop[tikv] |                        | ge(test.t1.x, 7), le(test.t1.x, 9) |
|     └─TableFullScan_17       | 10000.00 | cop[tikv] | table:t1, partition:p3 | keep order:false, stats:pseudo     |
+------------------------------+----------+-----------+------------------------+------------------------------------+
10 rows in set (12.69 sec)

查看region分布情况

/* Check regions */
# 查看对应的region情况,在4个region上
mysql> show table test.t1 regions;
+-----------+-----------+---------+-----------+-----------------+-------+------------+---------------+------------+----------------------+------------------+
| REGION_ID | START_KEY | END_KEY | LEADER_ID | LEADER_STORE_ID | PEERS | SCATTERING | WRITTEN_BYTES | READ_BYTES | APPROXIMATE_SIZE(MB) | APPROXIMATE_KEYS |
+-----------+-----------+---------+-----------+-----------------+-------+------------+---------------+------------+----------------------+------------------+
|      9003 | t_84_     | t_85_   |      9004 |            1001 | 9004  |          0 |      18449249 |   14117466 |                   13 |           141205 |
|      9005 | t_85_     | t_86_   |      9006 |            1001 | 9006  |          0 |      18443067 |   14024508 |                   10 |            58475 |
|      9007 | t_86_     | t_87_   |      9008 |            1001 | 9008  |          0 |      12295360 |    8703102 |                    5 |            27228 |
|      1002 | t_87_     |         |      1003 |            1001 | 1003  |          0 |      12295959 |    9218671 |                    4 |            26666 |
+-----------+-----------+---------+-----------+-----------------+-------+------------+---------------+------------+----------------------+------------------+
4 rows in set (2 min 46.43 sec)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/755152.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Ubuntu】安装docker-compose

要在Ubuntu上安装Docker Compose,可以按照以下步骤进行操作: 下载 Docker Compose 二进制文件: sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/loc…

产业大模型刚开卷,京东跑进“最后半公里”

点击关注 文|姚 悦 编|王一粟 “京东一直在探索哪些产品、技术、场景可以真正把大模型用起来,在我们内部的场景中反复验证后,才决定在7月份对外发布,现在我们在零售、健康、物流、金融等业务场景里已经积累了一些经…

架构训练营:3-3设计备选方案与架构细化

3架构中期 什么是备选架构? 备选架构定义了系统可行的架构模式和技术选型 备选方案筛选过程 头脑风暴 :对可选技术进行排列组合,得到可能的方案 红线筛选:根据系统明确的约束和限定,一票否决某些方案(主要…

Java分布式项目常用技术栈简介

Spring-Cloud-Gateway : 微服务之前架设的网关服务,实现服务注册中的API请求路由,以及控制流速控制和熔断处理都是常用的架构手段,而这些功能Gateway天然支持 运用Spring Boot快速开发框架,构建项目工程;并结合Spring…

java错误:不支持发行版本5或java: 不再支持源选项 5。请使用 6 或更高版本的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

Docker本地镜像发布到私有库

Docker Registry(Docker镜像仓库) 使用Docker Registry,可以创建私有或公共的镜像仓库,以存储Docker镜像。私有仓库可以用于存储公司内部的镜像,或者用于个人项目的镜像。公共仓库则会将发布的镜像分享到全世界。 1 …

【C++】string模拟实现

个人主页🍖:在肯德基吃麻辣烫 文章目录 前言一、string的成员变量二、string默认成员函数1.构造函数1.1 无参构造(默认构造)1.2 普通构造1.3无参构造和全缺省构造可以合并 浅拷贝和深拷贝2.拷贝构造3.赋值运算符重载4.析构函数 三、[]的下标访问和iterat…

P5 第二章 电阻电路的等效变换

1、电阻的Y形联结和△形联结的等效变换 可以发现电阻的Y形联结和△形联结可以刻画成下图模型: 如果Y形联结和△形联结i1,i2,i3都相等,则可以列公式解出R1,R2,R3之间的大小关系。 电路普遍存在对偶关系,可以将上图的电阻换成电导&#xff0c…

干货 | 一个漏洞利用工具仓库

0x00 Awesome-Exploit 一个漏洞证明/漏洞利用工具仓库 不定期更新 部分漏洞对应POC/EXP详情可参见以下仓库: https://github.com/Threekiii/Awesome-POC https://github.com/Threekiii/Vulhub-Reproduce 0x01 项目导航 ActiveMQ CVE-2015-5254 Apisix CVE-2…

el-upload实现上传文件夹(批量上传文件)

el-upload实现上传文件夹(批量上传文件)&#xff1a;关键代码在于 this.$refs.uploadFolder.$children[0].$refs.input.webkitdirectory true;//让el-upload支持上传文件夹 <template><div class"sg-body"><el-upload ref"uploadFolder" :…

【智能时代的颠覆】AI让物联网不再是物联网

自我介绍⛵ &#x1f4e3;我是秋说&#xff0c;研究人工智能、大数据等前沿技术&#xff0c;传递Java、Python等语言知识。 &#x1f649;主页链接&#xff1a;秋说的博客 &#x1f4c6; 学习专栏推荐&#xff1a;MySQL进阶之路、C刷题集、网络安全攻防姿势总结 欢迎点赞 &…

HTML5 WebSocket介绍与基本使用(解析服务端返回的二进制数据)

WebSocket基本介绍 WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。 WebSocket 使得客户端和服务器之间的数据交换变得更加简单&#xff0c;允许服务端主动向客户端推送数据。在 WebSocket API 中&#xff0c;浏览器和服务器只需要完成一次握手&a…

数据库系统 - 家庭教育平台设计开发

目录 1.绪论 1.1项目背景 1.2家庭教育平台的发展现状与优势 1.2.1国内外发展现状 1.2.2家庭教育平台的优势 2.需求分析 2.1可行性分析 2.1.1经济可行性 2.1.2 技术可行性 2.1.3操作可行性 2.2系统功能 2.2.1 家庭教育资源 2.2.2 家庭教育指导师 2.2.3家庭教育咨询…

H3C-Cloud Lab实验-静态路由配置实验

实验拓扑图&#xff1a; 接口IP地址规划&#xff1a; 实验需求&#xff1a; 1、理解静态路由的运行原理 2、掌握静态路由的配置 实验步骤&#xff1a; PC1和PC2的IP地址、子网掩码、网关 1、连接所有设备并重命名 2、R1&#xff0c;配置R1的接口IP地址&#xff0c;配置3.0、…

042、TiDB特性_系统表的使用

系统表存储位置 MySQL 存储TiDB 系统表 mysql.user 等 information_schmea提供了一种查看系统元数据的方法 与mysql兼容的表&#xff1a;tables、processlist、columns等自定义的表&#xff1a; cluster_config、cluster_hardware、tiflash_replica等等 metrics_schema: 基于P…

Java的数据结构-Map集合

文章目录 Map概述Map常用方法Map遍历元素的方法1.方法一&#xff1a;keySet()2.方法二&#xff1a;entrySet() Map概述 1、Map和collection没有继承关系2、Map集合以key和value的方式存储数据&#xff1a;键值对key和value都是引用数据类型。key和value都是存储对象的内存地址…

ChatGPT:利用人工智能助推教育创新

当前&#xff0c;世界正需要一个更加开放的、更加个性化的学习空间&#xff0c;学生的个性发展和生存发展应该被关注和尊重&#xff0c;课程应该引导学生掌握有用的东西&#xff0c;学生之间的差距应该被正视&#xff0c;教育成功的标准也要被重新定义。过去&#xff0c;我们总…

如何有效利用chatgpt?

如何有效地使用ChatGPT&#xff1f; 代码、诗歌、歌曲和短篇小说都可以由 ChatGPT 以特定的风格编写。您所需要的只是正确的问题和适当的提示。以下是有关如何有效使用ChatGPT的一些提示和想法&#xff1a; 头脑 风暴获取初稿解决编码问题尝试不同的提示格式查找标题寻求帮助…

Docker安装ElasticSearch/ES

目录 前言准备拉取ElasticSearch镜像安装ElasticSearch拉取elasticsearch-head镜像安装elasticsearch-head参考 前言 TencentOS Server 3.1Docker version 19.03.14, build 5eb3275d40 准备 docker 已安装。 安装 docker 参考&#xff1a;【Centos 8】【Centos 7】安装 docke…

XSS简介

OWASP TOP 10 OWASP(开放式Web应用程序安全项目)的工具&#xff0c;文档&#xff0c;论坛额全球各地分会都是开放的&#xff0c;对所有致力于改进应用程序安全的人士开放&#xff0c;最具权威的就是10项目最严重的Web应用程序安全风险列表 Cross Site Scripting&#xff08;X…