AnalyticDB MySQL-表和索引与MySQL的差异

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: AnalyticDB MySQL在语法上兼容MySQL,但是它的技术架构不同于MySQL,表和索引也和MySQL差异较大,这篇文章列出了这些差异,在使用AnalyticDB MySQL创建表时可以参考一下。

     AnalyticDB MySQL版是阿里云的海量数据实时高并发在线分析数据仓库,语法完全兼容MySQL,在使用AnalyticDB MySQL时表面上就和使用MySQL一样,建表时也可以使用MySQL的建表语句。但是,这个只是表面现象, AnalyticDB MySQL在技术架构上和MySQL完全不同,在表和索引的使用上也和MySQL差异较大,如果忽视这些差异,将它当作MySQL来使用,可能会较大为问题。

1 AnalyticDB MySQL中的表

      AnalyticDB MySQL版支持复制表和普通表两种类型。复制表也可以称为广播表,会在集群的每个节点存储一份数据,对应与数据仓库中的维度表,因此复制表的数据量不宜太大,阿里的建议每张复制表存储的数据不超过2万行。

      AnalyticDB MySQL的普通表和MySQL数据库的普通表的概念不同,在AnalyticDB MySQL里,普通表实际上是分片表,AnalyticDB MySQL的建表语法同MySQL兼容,如果使用MySQL的建表语法创建了一张表,在表有主键的情况下,AnalyticDB MySQL会以主键作为分片键,如果没有主键,如果MySQL表不含有主键,AnalyticDB MySQL版将添加一个__adb_auto_id__字段作为主键和分布键。

      假设用户用下面的MySQL的建表语句在AnalyticDB MySQL建了一张表

CREATETABLE t (c1 bigint, c2 int, c3 varchar, PRIMARY KEY(c1,c2));    Query OK,0 rows affected (2.37 sec)

      在AnalyticDB MySQL中查看表的定义是下面这个样子

SHOW CREATETABLE t;+-------+-------------------------------------------------------------------------------------------------------------------------------+|Table|CreateTable|+-------+-------------------------------------------------------------------------------------------------------------------------------+| t     |CreateTable `t` (     `c1` bigint,     `c2` int,     `c3` varchar,     primary key (c1,c2)) DISTRIBUTED BY HASH(`c1`,`c2`) INDEX_ALL='Y'|+-------+-------------------------------------------------------------------------------------------------------------------------------+1 row inset(0.04 sec)

     从上面的建表语句可以看到,在AnalyticDB MySQL中,分片(使用分布键)是必须的,强制的,除非使用复制表,分区则是用户自由定制的。AnalyticDB MySQL中,分布

采用的是哈希算法,每张表只支持一个分布键,这个是显而易见的,因为AnalyticDB MySQL使用分布键在集群内的节点上分布数据,在实际分布数据时,只能选择一种分布方式,多个分布键毫无意义。在选择分布键时,不建议选择日期、时间和时间戳类型,而应该选择交易ID、设备ID、用户ID(具有业务特征的),如果此类的键,可以选择自增键。这样选择的目的是将可能利用AnalyticDB MySQL的节点进行分布是计算,举一个简单的例子,我们要查询一批用户的一段时间内数据,首先想到的是查询是以每个用户为单位来区分的,我们希望把每个用户的查询分布到不同的节点上,而不是希望每个时间段的数据的查询分布到不同的节点上。在分布键的选择上,还要注意优先选择查询频率高的、join的键作为分布键。

     另一个值得注意的地方是,在AnalyticDB MySQL中,表的分片数是自动决定的,用户不可以手动设置一个表的分片数,一个表的具体分片数是由数据库的版本和集群的配置决定的,配置越高,表的分片树越多。

     在分布的基础上,可以再对表进行分区,当一个分片的数据库太大影响查询性能时,就需要对分片进行分区。这里的分区类似mysql数据库中范围分区,最常见的是时间作为分区键。

      分区的另外的好处是可以利用AnalyticDB MySQL的LIFECYCLE N特定以及冷热特性,超过生命周期的分区会被自动删除,也可以设置冷热分区的比例。二级分区的数据应该维持静态,数据不应在二级分区之间内移动,如果二级分区频繁更新,可能是分区键选择的不合理。

     表的主键,主键可以作为每一条记录的唯一标识。在创建表时,通过PRIMARY KEY来定义主键,在AnalyticDB MySQL中,只用定义了主键表才支持数据更新操作,包括更新和删除。

     主键可以是单个字段或多个字段的组合,同时主键必须包含分布键和分区键,考虑到性能,分布键和分区键尽可能放到主键的前部。

     在表上也可以创建聚集索引,每个表仅仅支持创建一个聚集索引。

     下面用一个官网上的例子说明一下,

CREATETABLE customer (        customer_id bigintNOTNULL COMMENT '顾客ID',        customer_name varcharNOTNULL COMMENT '顾客姓名',        phone_num bigintNOTNULL COMMENT '电话',        city_name varcharNOTNULL COMMENT '所属城市',        sex intNOTNULL COMMENT '性别',        id_number varcharNOTNULL COMMENT '身份证号码',        home_address varcharNOTNULL COMMENT '家庭住址',        office_address varcharNOTNULL COMMENT '办公地址',        age intNOTNULL COMMENT '年龄',        login_time timestampNOTNULL COMMENT '登录时间',        PRIMARY KEY (login_time, customer_id, phone_num))        DISTRIBUTED BY HASH(customer_id)        PARTITION BY VALUE(DATE_FORMAT(login_time,'%Y%m%d')) LIFECYCLE 30        COMMENT '客户信息表';

     表customer采用customer_id作为分布键,以login_time作为分区键,主键必须包含分区键和分布键,这里选择login_time, customer_id, phone_num,分布键和分区键尽可能放到主键的前部和分布键放在主键靠前的部分,分区以天为单位,同时设置了LIFECYCLE特性,超过30天的分区会被自动删除。

2 自适应索引

      AnalyticDB MySQL的玄武存储引擎采用了自适应列级自动索引技术,针对字符串、数字、文本、JSON、向量等列类型都会自动创建索引,在数据库中创建一张表后用show indexes from <表名>查询,

      可以看到每个列上都有一个索引,这些索引是AnalyticDB MySQL自动创建的,AnalyticDB MySQL可以做到列级索引任意维度组合检索、多路渐进流式归并,大幅提升了数据过滤性


相关实践学习
AnalyticDB MySQL海量数据秒级分析体验
快速上手AnalyticDB MySQL,玩转SQL开发等功能!本教程介绍如何在AnalyticDB MySQL中,一键加载内置数据集,并基于自动生成的查询脚本,运行复杂查询语句,秒级生成查询结果。
阿里云云原生数据仓库AnalyticDB MySQL版 使用教程
云原生数据仓库AnalyticDB MySQL版是一种支持高并发低延时查询的新一代云原生数据仓库,高度兼容MySQL协议以及SQL:92、SQL:99、SQL:2003标准,可以对海量数据进行即时的多维分析透视和业务探索,快速构建企业云上数据仓库。 了解产品 https://www.aliyun.com/product/ApsaraDB/ads
相关文章
|
13天前
|
SQL 关系型数据库 MySQL
案例剖析:MySQL唯一索引并发插入导致死锁!
案例剖析:MySQL唯一索引并发插入导致死锁!
案例剖析:MySQL唯一索引并发插入导致死锁!
|
7天前
|
存储 关系型数据库 MySQL
Mysql(4)—数据库索引
数据库索引是用于提高数据检索效率的数据结构,类似于书籍中的索引。它允许用户快速找到数据,而无需扫描整个表。MySQL中的索引可以显著提升查询速度,使数据库操作更加高效。索引的发展经历了从无索引、简单索引到B-树、哈希索引、位图索引、全文索引等多个阶段。
38 3
Mysql(4)—数据库索引
|
1天前
|
存储 关系型数据库 MySQL
如何在MySQL中进行索引的创建和管理?
【10月更文挑战第16天】如何在MySQL中进行索引的创建和管理?
10 1
|
2天前
|
监控 关系型数据库 MySQL
mysql8索引优化
综上所述,深入理解和有效实施这些索引优化策略,是解锁MySQL 8.0数据库高性能查询的关键。
9 0
|
6天前
|
SQL 关系型数据库 MySQL
美团面试:mysql 索引失效?怎么解决? (重点知识,建议收藏,读10遍+)
本文详细解析了MySQL索引失效的多种场景及解决方法,包括破坏最左匹配原则、索引覆盖原则、前缀匹配原则、`ORDER BY`排序不当、`OR`关键字使用不当、索引列上有计算或函数、使用`NOT IN`和`NOT EXISTS`不当、列的比对等。通过实例演示和`EXPLAIN`命令分析,帮助读者深入理解索引失效的原因,并提供相应的优化建议。文章还推荐了《尼恩Java面试宝典》等资源,助力面试者提升技术水平,顺利通过面试。
|
9天前
|
关系型数据库 MySQL 数据库
深入浅出MySQL索引优化:提升数据库性能的关键
在这个数据驱动的时代,数据库性能的优劣直接关系到应用的响应速度和用户体验。MySQL作为广泛使用的数据库之一,其索引优化是提升查询性能的关键。本文将带你一探MySQL索引的内部机制,分析索引的类型及其适用场景,并通过实际案例演示如何诊断和优化索引,以实现数据库性能的飞跃。
|
11天前
|
SQL 存储 关系型数据库
MySQL新增字段/索引会不会锁表?
MySQL新增字段/索引会不会锁表?
|
9天前
|
存储 SQL 关系型数据库
Mysql学习笔记(二):数据库命令行代码总结
这篇文章是关于MySQL数据库命令行操作的总结,包括登录、退出、查看时间与版本、数据库和数据表的基本操作(如创建、删除、查看)、数据的增删改查等。它还涉及了如何通过SQL语句进行条件查询、模糊查询、范围查询和限制查询,以及如何进行表结构的修改。这些内容对于初学者来说非常实用,是学习MySQL数据库管理的基础。
43 6
|
9天前
|
SQL Ubuntu 关系型数据库
Mysql学习笔记(一):数据库详细介绍以及Navicat简单使用
本文为MySQL学习笔记,介绍了数据库的基本概念,包括行、列、主键等,并解释了C/S和B/S架构以及SQL语言的分类。接着,指导如何在Windows和Ubuntu系统上安装MySQL,并提供了启动、停止和重启服务的命令。文章还涵盖了Navicat的使用,包括安装、登录和新建表格等步骤。最后,介绍了MySQL中的数据类型和字段约束,如主键、外键、非空和唯一等。
27 3
Mysql学习笔记(一):数据库详细介绍以及Navicat简单使用
|
14天前
|
缓存 算法 关系型数据库
Mysql(3)—数据库相关概念及工作原理
数据库是一个以某种有组织的方式存储的数据集合。它通常包括一个或多个不同的主题领域或用途的数据表。
38 5
Mysql(3)—数据库相关概念及工作原理

热门文章

最新文章