【基础篇】ClickHouse 表引擎详解

news2025/1/12 22:59:02

文章目录

  • 0. 引言
  • 1. 什么是表引擎
  • 2. 不同表引擎使用场景
      • 1. MergeTree:
      • 2. Log:
      • 3. Memory:
      • 4. Distributed:
      • 5. Kafka:
      • 6. MaterializedView:
      • 7. File和URL:
  • 3. MergeTree 家族
      • 3.1. MergeTree:
      • 3.2. ReplacingMergeTree:
      • 3.3. SummingMergeTree:
      • 3.4. AggregatingMergeTree:
      • 3.5. CollapsingMergeTree:
      • 3.6. VersionedCollapsingMergeTree:
  • 4. Log 家族
      • 4.1. TinyLog:
      • 4.2. StripeLog:
      • 4.3. Log:
    • 5. Memory 和 File 家族
      • 5.1. Memory:
      • 5.1.2. File:
  • 6. Null 家族
  • 7. 外部数据表引擎(MySQL, HDFS, URL, etc.)
      • 7.1. MySQL:
      • 7.2. HDFS:
      • 7.3. URL:
  • 引擎类型
    • MergeTree {#mergetree}
    • 日志
    • 集成引擎 {#integration-engines}
    • 用于其他特定功能的引擎 {#yong-yu-qi-ta-te-ding-gong-neng-de-yin-qing}
  • 虚拟列
  • 参考文档

在这里插入图片描述

0. 引言

ClickHouse的一大特性就是其表引擎,表引擎决定了如何存储数据,以及如何处理对数据的读写操作。在ClickHouse中,每张表都由一个表引擎支持,而且在创建表的时候就需要指定其表引擎

ClickHouse有很多类型的表引擎,包括基于磁盘存储的表引擎如MergeTree系列(MergeTree、ReplacingMergeTree、SummingMergeTree等)、Log系列(TinyLog、StripedLog、Log)等,也有基于内存存储的表引擎如Memory。每种表引擎都有其适用的场景和特性,例如,MergeTree系列是最常用的表引擎,适用于大量数据的存储和分析,而Memory引擎则适用于存储少量临时数据。

了解和选择合适的表引擎是使用ClickHouse进行高效数据分析的关键。接下来,我们将详细介绍各种类型的表引擎,以及它们的应用场景和限制。

1. 什么是表引擎

表引擎(Table Engine)是一种数据库管理系统中的关键部分,负责存储数据、读取数据和处理数据查询。不同的表引擎具有不同的性能特性和适用范围。

在某些数据库系统中,例如MySQL,你可以为每个表选择不同的表引擎,包括InnoDB,MyISAM,Memory等。这些表引擎在功能、性能、并发能力、恢复能力等方面都有所不同。

在ClickHouse中,表引擎的选择将影响数据的存储格式、索引的使用、并发控制机制、是否支持数据复制等许多重要的方面。

表引擎(即表的类型)决定了什么

  • 数据的存储方式和位置,写到哪里以及从哪里读取数据
  • 支持哪些查询以及如何支持。
  • 并发数据访问。
  • 索引的使用(如果存在)。
  • 是否可以执行多线程请求。
  • 数据复制参数。

2. 不同表引擎使用场景

1. MergeTree:

说明:MergeTree是ClickHouse的主要表引擎,支持索引和数据分区,适用于大数据计算。

使用场景:适用于大数据分析,如用户行为分析、日志分析等。

示例:

CREATE TABLE example_merge_tree
(
    date Date,
    id UInt32,
    value String
) ENGINE = MergeTree()
PARTITION BY toYYYYMM(date)
ORDER BY (date, id)
SETTINGS index_granularity = 8192;

2. Log:

说明:Log表引擎用于存储日志和其他机器数据。不支持索引和数据分区。

使用场景:适用于小数据量的日志和其他机器数据的存储。

示例:

CREATE TABLE example_log
(
    event_time DateTime,
    event_type String,
    event_data String
) ENGINE = Log;

3. Memory:

说明:Memory表引擎将所有数据存储在RAM中,适用于临时表和小数据量。

使用场景:适用于需要快速访问和计算的小数据量场景。

示例:

CREATE TABLE example_memory
(
    key UInt32,
    value String
) ENGINE = Memory;

4. Distributed:

说明:Distributed表引擎用于在多个节点间分布查询和数据。它自动分发查询和数据到所有节点。

使用场景:适用于需要在多个节点间进行数据分析的分布式场景。

示例:

CREATE TABLE example_distributed
(
    date Date,
    id UInt32,
    value String
) ENGINE = Distributed('my_cluster', 'my_database', 'example_merge_tree', rand());

5. Kafka:

说明:Kafka表引擎用于和Kafka集成,可用于实时数据流处理。

使用场景:适用于实时数据处理,如日志实时处理、实时数据分析等。

示例:

CREATE TABLE example_kafka
(
    event_time DateTime,
    event_type String,
    event_data String
) ENGINE = Kafka()
SETTINGS
    kafka_broker_list = 'localhost:9092',
    kafka_topic_list = 'test_topic',
    kafka_group_name = 'test_group',
    kafka_format = 'JSONEachRow',
    kafka_num_consumers = 2;

6. MaterializedView:

说明:MaterializedView引擎用于预处理数据,可以提高查询性能。

使用场景:适用于需要对大数据进行预处理以提高查询性能的场景。

示例:

CREATE MATERIALIZED VIEW example_mv
ENGINE = AggregatingMergeTree()
PARTITION BY toYYYYMM(date)
ORDER BY (date, id)
AS
SELECT
    date,
    id,
    count() AS count
FROM example_merge_tree
GROUP BY date, id;

7. File和URL:

说明:File和URL表引擎用于对文件进行操作,例如CSV、Parquet等。

使用场景:适用于需要对文件进行操作的场景,如ETL操作、数据导入导出等。

示例:

CREATE TABLE example_file
(
    id UInt32,
    value String
) ENGINE = File(CSV, '/path/to/your/csv_file.csv');

CREATE TABLE example_url
(
    id UInt32,
    value String
) ENGINE = URL('http://example.com/data.csv', CSV);

3. MergeTree 家族

ClickHouse的MergeTree家族引擎是一组支持实时数据更新、查询和数据合并功能的表引擎。这些引擎为大数据场景提供了高性能的解决方案。以下是MergeTree家族的主要成员及其使用场景。
MergeTree家族引擎根据不同的业务场景提供了多种实时数据处理功能,为大数据场景下的实时计算提供了强大的支持。在进行数据建模时,可以根据具体需求选择合适的MergeTree引擎。

3.1. MergeTree:

说明:MergeTree是ClickHouse的基本表引擎,支持索引和数据分区。

使用场景:适用于大数据分析,如用户行为分析、日志分析等。

示例:

CREATE TABLE example_merge_tree
(
    date Date,
    id UInt32,
    value String
) ENGINE = MergeTree()
PARTITION BY toYYYYMM(date)
ORDER BY (date, id)
SETTINGS index_granularity = 8192;

3.2. ReplacingMergeTree:

说明:ReplacingMergeTree用于实时删除重复数据。当合并过程中发现相同的主键数据时,只保留最新的一条记录。

使用场景:适用于需要实时删除重复数据的场景,如实时去重、数据清洗等。

示例:

CREATE TABLE example_replacing_merge_tree
(
    date Date,
    id UInt32,
    value String
) ENGINE = ReplacingMergeTree()
PARTITION BY toYYYYMM(date)
ORDER BY (date, id)
SETTINGS index_granularity = 8192;

3.3. SummingMergeTree:

说明:SummingMergeTree用于实时对数值型字段进行求和。在合并过程中,具有相同主键的记录将被合并为一条记录,并对指定字段求和。

使用场景:适用于需要对数值型字段进行实时求和的场景,如计数器、流量统计等。

示例:

CREATE TABLE example_summing_merge_tree
(
    date Date,
    id UInt32,
    value UInt32
) ENGINE = SummingMergeTree(value)
PARTITION BY toYYYYMM(date)
ORDER BY (date, id)
SETTINGS index_granularity = 8192;

3.4. AggregatingMergeTree:

说明:AggregatingMergeTree用于实时对数据进行聚合。在合并过程中,具有相同主键的记录将被聚合为一条记录,根据指定的聚合函数进行计算。

使用场景:适用于需要实时聚合数据的场景,如统计、报表等。

示例:

CREATE TABLE example_aggregating_merge_tree
(
    date Date,
    id UInt32,
    value UInt32,
    countState AggregateFunction(count)
) ENGINE = AggregatingMergeTree()
PARTITION BY toYYYYMM(date)
ORDER BY (date, id)
SETTINGS index_granularity = 8192;

3.5. CollapsingMergeTree:

说明:CollapsingMergeTree用于实时删除重复数据。不同于ReplacingMergeTree,它使用一个名为Sign的列来表示记录的状态(1表示插入,-1表示删除)。在合并过程中,符号相反且其他列相同的记录会被抵消。

使用场景:适用于需要实时删除重复数据的场景,如数据同步、状态更新等。

示例:

CREATE TABLE example_collapsing_merge_tree
(
    date Date,
    id UInt32,
    value String,
    sign Int8
) ENGINE = CollapsingMergeTree(sign)
PARTITION BY toYYYYMM(date)
ORDER BY (date, id)
SETTINGS index_granularity = 8192;

3.6. VersionedCollapsingMergeTree:

说明:VersionedCollapsingMergeTree与CollapsingMergeTree类似,但它还使用一个名为Version的列来表示记录的版本。在合并过程中,版本较新的记录会覆盖版本较旧的记录。

使用场景:适用于需要实时删除重复数据并支持版本控制的场景,如数据历史记录、状态更新等。

示例:

CREATE TABLE example_versioned_collapsing_merge_tree
(
    date Date,
    id UInt32,
    value String,
    sign Int8,
    version UInt32
) ENGINE = VersionedCollapsingMergeTree(sign, version)
PARTITION BY toYYYYMM(date)
ORDER BY (date, id)
SETTINGS index_granularity = 8192;

4. Log 家族

ClickHouse的Log家族引擎是一组专门用于大数据日志处理的表引擎。这些引擎能够快速地处理大量日志数据,并以极高的性能对其进行查询。以下是Log家族的主要成员及其使用场景。

4.1. TinyLog:

说明:TinyLog是一种非常简单的引擎,它将所有列保存在一个文件中。不支持索引,所以查询速度较慢,但是插入速度快。

使用场景:适用于小型数据集和日志记录。

示例:

CREATE TABLE example_tinylog
(
    date Date,
    id UInt32,
    value String
) ENGINE = TinyLog;

4.2. StripeLog:

说明:StripeLog在存储结构上类似于TinyLog,但是数据分为几个部分(stripes)进行存储,每个stripe对应一个块(block)。不支持索引。

使用场景:适用于较大的日志记录。

示例:

CREATE TABLE example_stripelog
(
    date Date,
    id UInt32,
    value String
) ENGINE = StripeLog;

4.3. Log:

说明:Log是一种简单的引擎,它把每一列的数据分别存储在不同的文件中。不支持索引,适用于大量的日志数据。

使用场景:适合大量的日志记录和流数据。

示例:

CREATE TABLE example_log
(
    date Date,
    id UInt32,
    value String
) ENGINE = Log;

总结:Log家族引擎特别适合处理大量的日志数据,能够以极高的效率插入和查询数据。但是由于这些引擎不支持索引,所以查询性能会比MergeTree家族的引擎要差一些。在进行数据建模时,可以根据数据量和查询需求选择合适的Log引擎。

5. Memory 和 File 家族

ClickHouse中的Memory和File家族引擎分别用于在内存和文件系统中存储数据。以下是Memory和File家族的主要成员及其使用场景。

5.1. Memory:

说明:Memory引擎将所有数据存储在内存中。它支持实时查询,并且具有极高的查询速度。但是,由于它将所有数据保存在内存中,因此在服务器重启或崩溃时,数据会丢失。

使用场景:适用于需要快速查询的小型数据集,如缓存、临时表或实时分析。

示例:

CREATE TABLE example_memory
(
    date Date,
    id UInt32,
    value String
) ENGINE = Memory;

5.1.2. File:

说明:File引擎将数据保存在服务器的文件系统中。它支持将数据存储为各种文件格式(如CSV、Parquet、JSON等)。File引擎不支持索引,因此查询速度较慢。

使用场景:适用于需要将数据以特定文件格式存储的场景,如ETL操作、数据备份或离线分析。

示例:

CREATE TABLE example_file
(
    date Date,
    id UInt32,
    value String
) ENGINE = File(CSV);

总结:Memory和File家族引擎分别用于内存和文件系统中的数据存储。Memory引擎具有非常高的查询速度,适用于实时查询,但数据在服务器重启或崩溃时会丢失。File引擎适用于需要将数据存储为特定文件格式的场景,但查询速度较慢。在进行数据建模时,可以根据数据存储需求和查询需求选择合适的Memory或File引擎。

6. Null 家族

Null家族是ClickHouse中的一个特殊的表引擎家族,它基本上不会执行任何操作或存储任何数据。以下是Null家族的主要成员及其使用场景:

  1. Null:

说明:Null引擎不保存数据,并且不对数据进行任何操作。当你往这个表里面插入数据时,数据会被直接丢弃。对于从这个表中的查询,它总是返回一个空结果。

使用场景:Null引擎主要用于调试或测试,例如,你可能想要测试插入或查询的性能,而不实际保存任何数据。另一个常见用例是作为一个"黑洞"表,用来快速丢弃不需要的数据。

示例:

CREATE TABLE example_null
(
    date Date,
    id UInt32,
    value String
) ENGINE = Null;

总结:Null家族引擎基本上不执行任何操作,也不保存任何数据。尽管Null引擎在生产环境中的应用可能有限,但在调试和测试中可能很有用。

7. 外部数据表引擎(MySQL, HDFS, URL, etc.)

ClickHouse支持外部数据表引擎,这些引擎可以让你以类似于操作本地表的方式访问外部数据源。以下是一些常见的外部数据表引擎及其特点:

7.1. MySQL:

说明:MySQL表引擎允许你将MySQL数据库中的数据表作为ClickHouse本地表进行操作。这使得你可以方便地在ClickHouse中查询MySQL表数据。

使用场景:当你需要在ClickHouse中查询MySQL中的数据时,MySQL表引擎非常有用。

示例:

CREATE TABLE mysql_table
(
    id UInt32,
    name String,
    age UInt8
) ENGINE = MySQL('host:port', 'database_name', 'table_name', 'user', 'password');

7.2. HDFS:

说明:HDFS表引擎可以让你将Hadoop分布式文件系统(HDFS)中的数据表作为ClickHouse本地表进行操作。它支持各种文件格式,如Parquet、ORC、Avro等。

使用场景:当你需要在ClickHouse中查询HDFS中的数据时,HDFS表引擎非常有用。

示例:

CREATE TABLE hdfs_table
(
    id UInt32,
    name String,
    age UInt8
) ENGINE = HDFS('hdfs://host:port/path/to/data/file.parquet', 'Parquet');

7.3. URL:

说明:URL表引擎可以让你将远程文件(通过HTTP或HTTPS访问)作为ClickHouse本地表进行操作。它支持各种文件格式,如CSV、TSV、JSON等。

使用场景:当你需要在ClickHouse中查询远程文件中的数据时,URL表引擎非常有用。

示例:

CREATE TABLE url_table
(
    id UInt32,
    name String,
    age UInt8
) ENGINE = URL('https://example.com/data.csv', 'CSV', 'id UInt32, name String, age UInt8');

总结:外部数据表引擎可以让你方便地访问外部数据源,如MySQL、HDFS或URL等。这使得在ClickHouse中整合和查询多种数据源变得简单。


引擎类型

MergeTree {#mergetree}

适用于高负载任务的最通用和功能最强大的表引擎。这些引擎的共同特点是可以快速插入数据并进行后续的后台数据处理。 MergeTree系列引擎支持数据复制(使用Replicated* 的引擎版本),分区和一些其他引擎不支持的其他功能。

该类型的引擎:

  • MergeTree
  • ReplacingMergeTree
  • SummingMergeTree
  • AggregatingMergeTree
  • CollapsingMergeTree
  • VersionedCollapsingMergeTree
  • GraphiteMergeTree

日志

具有最小功能的轻量级引擎。当您需要快速写入许多小表(最多约100万行)并在以后整体读取它们时,该类型的引擎是最有效的。

该类型的引擎:

  • TinyLog
  • StripeLog
  • Log

集成引擎 {#integration-engines}

用于与其他的数据存储与处理系统集成的引擎。
该类型的引擎:

  • Kafka
  • MySQL
  • ODBC
  • JDBC
  • HDFS

用于其他特定功能的引擎 {#yong-yu-qi-ta-te-ding-gong-neng-de-yin-qing}

该类型的引擎:

  • Distributed
  • MaterializedView
  • Dictionary
  • Merge
  • File
  • Null
  • Set
  • Join
  • URL
  • View
  • Memory
  • Buffer

虚拟列

虚拟列是表引擎组成的一部分,它在对应的表引擎的源代码中定义。

您不能在 CREATE TABLE 中指定虚拟列,并且虚拟列不会包含在 SHOW CREATE TABLEDESCRIBE TABLE 的查询结果中。虚拟列是只读的,所以您不能向虚拟列中写入数据。

如果想要查询虚拟列中的数据,您必须在SELECT查询中包含虚拟列的名字。SELECT * 不会返回虚拟列的内容。

若您创建的表中有一列与虚拟列的名字相同,那么虚拟列将不能再被访问。我们不建议您这样做。为了避免这种列名的冲突,虚拟列的名字一般都以下划线开头。

参考文档

  1. Yandex ClickHouse官方文档: https://clickhouse.tech/
  2. ClickHouse表引擎介绍: https://clickhouse.tech/docs/en/engines/table-engines/
  3. ClickHouse的表引擎选择: https://www.jianshu.com/p/752c1f8b38e7
  4. ClickHouse的数据存储和计算原理: https://www.jianshu.com/p/a1d3d6e1f76a
  5. ClickHouse表引擎深入理解: https://zhuanlan.zhihu.com/p/142616461

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

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

相关文章

全自动orm框架SpringData Jpa 简单使用

目录 介绍 整合springboot 简单使用 基本操作 查询数据 新增 ​编辑 删除 ​编辑 分页查询 自定义方法查询 自定义sql查询 一对一映射 一对多映射 ​编辑 介绍 Spring data JPA是Spring在ORM框架,以及JPA规范的基础上,封装的一套JPA应用框…

C【数组】

1.一维数组 1.1 数组的创建 1.2 数组的初始化 1.3 一维数组的使用 int main() { // char arr[] "abcdef";//[a][b][c][d][e][f][\0] // //printf("%c\n", arr[3]);//d // int i 0; // int len strlen(arr); // for(i0; i<len; i) // { // p…

【DBAPI教程】DBAPI如何使用复杂多层嵌套JSON作为请求参数

DBAPI如何使用复杂多层嵌套JSON作为请求参数 DBAPI作为一款后端低代码接口快速开发工具&#xff0c;不仅能实现简单的字段传参给SQL&#xff0c;也可以实现复杂的JSON传参。下面我们就来看一个实际的例子。 背景需求 假设我们现在MySql有一张GDP表&#xff0c;内容如下&…

代码随想录 -- day52 --300.最长递增子序列 、674. 最长连续递增序列 、718. 最长重复子数组

300.最长递增子序列 dp[i]表示i之前包括i的以nums[i]结尾的最长递增子序列的长度 if (nums[i] > nums[j]) dp[i] max(dp[i], dp[j] 1); 每一个i&#xff0c;对应的dp[i]&#xff08;即最长递增子序列&#xff09;起始大小至少都是1. class Solution { public:int lengt…

Godot使用C#语言编写脚本(使用VSCode作为外部编辑器)

文章目录 Godot部分查看VSCode的所在位置配置外部编辑器 配置VSCode编写脚本中文注释 其他文章字符编码 Godot部分 打开编辑器-编辑器设置&#xff1b; 查看VSCode的所在位置 右键单击你的VScode快捷方式&#xff0c;选择属性。 这里的目标就是你的VSCode所在的位置。 配…

初识Java 9-2 内部类

目录 为什么需要内部类 闭包和回调 内部类和控制框架 继承内部类 内部类的重写&#xff08;并不能&#xff09; 局部内部类 内部类标识符 本笔记参考自&#xff1a; 《On Java 中文版》 为什么需要内部类 在一些情况下&#xff0c;我们无法享受接口带来的便利&#xff0…

差分方程模型:国民总收入(GDP)的乘数-加速数模型

【背景知识-凯恩斯经济增长模型】 凯恩斯(John M.Keynes)建立了著名的国民经济增长模型。令Y表示国民总收入&#xff0c;C表示总消费&#xff0c;E为总支出&#xff0c;I表示投资&#xff0c;G为政府的投入&#xff08;如基建等&#xff09;。那么有 【6.1】 其中&#xff0…

黑马JVM总结(十一)

&#xff08;1&#xff09;垃圾回收概述 前面我们学了堆&#xff0c;里面有一个垃圾回收的机制 &#xff08;2&#xff09;判断垃圾_引用计数 指只要有一个对象被其他变量所引用&#xff0c;我们就让这个对象的计数加1&#xff0c;有个一变量不在引用&#xff0c;让它的计数…

Leetcode—— 1. 两数之和

题目 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你可以按任意顺…

代码随想录训练营第四十八天|198.打家劫舍 ● 213.打家劫舍II ● 337.打家劫舍III

198.打家劫舍 力扣题目链接(opens new window) 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系…

Zookeeper 源码分析流程

文章目录 前言Zookeeper启动加载磁盘数据与客户端的通信交互Leader选举准备节点状态处理总结 前言 Zookeeper 作为分布式协调服务为分布式系统提供了一些基础服务&#xff0c;如&#xff1a;命名服务、配置管理、同步等&#xff0c;使得开发者可以更加轻松地处理分布式问题。 …

Java 基于 SPringBoot 的幼儿园管理系统,附源码、数据库

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W,Csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 文章目录 一、效果演示二、前言介绍三、主要技术四、系统设计&#xff08;部分&#xff09;4.1、主要功能模…

ipv6笔记及总结

1、路由器请求消息Router Solicitation和路由器通告Router Advertisement消息主要用于无状态地址的情况下&#xff0c;有状态的情况使用的是dhcpv6 server分配&#xff08;例如&#xff1a;IPv6地址以及其他信息&#xff08;DNS、域名等&#xff09;&#xff09;。 2、关于IPv…

腾讯mini项目-【指标监控服务重构】2023-08-16

今日已办 v1 验证 StageHandler 在处理消息时是否为单例&#xff0c;【错误尝试】 type StageHandler struct { }func (s StageHandler) Middleware1(h message.HandlerFunc) message.HandlerFunc {return func(msg *message.Message) ([]*message.Message, error) {log.Log…

安全线程的集合

1. CopyOnWriteArrayList package com.kuang.unsafe;import java.util.*; import java.util.concurrent.CopyOnWriteArrayList;//java.util.ConcurrentModificationException 并发修改异常&#xff01; 因为List集合线程不安全&#xff01; public class ListTest {public st…

Linux —— 线程

一&#xff0c;线程概念 在一程序内&#xff0c;一个执行路线称为线程thread&#xff0c;即线程是一个进程内部的控制序列&#xff1b; 一切进程至少都有一个执行线程&#xff1b;线程在进程内部运行&#xff0c;本质是在进程地址空间内运行&#xff1b;在Linux系统中&#xf…

许可分析 license分析 第十七章

许可分析是指对软件许可证进行详细的分析和评估&#xff0c;以了解组织内部对软件许可的需求和使用情况。通过许可分析&#xff0c;可以帮助组织更好地管理和优化软件许可证的使用。以下是一些可能的许可分析方法和步骤&#xff1a; 软件许可证的云化管理&#xff1a;将许可证管…

如何删除清理Mac“其他”文件并删除它

当我们通过「关于本机」>「存储空间」查看硬盘的空间占用情况时。系统会将存储空间根据不同文件类别所占的空间大小显示在条状图上&#xff0c;大部分类型看文字都比较好理解&#xff0c;但对于“其他”这一类很多小伙伴都感觉很困惑&#xff0c;会产生一些问题如&#xff1…

Mac FoneLab for Mac:轻松恢复iOS数据,专业工具助力生活

如果你曾经不小心删除了重要的iOS数据&#xff0c;或者因为各种原因丢失了这些数据&#xff0c;那么你一定知道这种痛苦。现在&#xff0c;有一个名为Mac FoneLab的Mac应用程序&#xff0c;它专门设计用于恢复iOS数据&#xff0c;这可能是你的救星。 Mac FoneLab for Mac是一种…

MySQL数据库详解 二:数据库的高级语言和操作

文章目录 1. 克隆表 ---- 将数据表的数据记录生成到新的表中1.1 方式一&#xff1a;先创建新表&#xff0c;再导入数据1.2方式二&#xff1a;创建的时候同时导入 2. 清空表 ---- 删除表内的所有数据2.1 delete删除2.2 truncate删除&#xff08;重新记录&#xff09;2.3 创建临时…