SQL 常见问题
基本功能相关
MatrixOne 对标识符大小写敏感吗?
MatrixOne 默认对标识符大小写不敏感,并支持通过 lower_case_table_names 参数来进行大小写敏感的支持,对于参数的详细介绍可参见大小写敏感支持
MatrixOne 支持哪些 SQL 语句?
MatrixOne 目前支持的 SQL 语句可以参考 SQL 语句的分类。
MatrixOne 支持哪些数据类型?
MatrixOne 目前支持常用的整型,浮点数,字符串,时间日期,布尔,枚举,二进制,JSON 类型,请参考数据类型概览。
MatrixOne 支持什么类型的字符集?
MatrixOne 默认支持 UTF-8 字符集,且目前只支持 UTF-8。
MatrixOne 支持哪些约束和索引?
MatrixOne 目前支持主键 (Primary Key), 唯一 (Unique Key), 非空 (Not Null),外键 (Foreign Key),自增约束 (Auto Increment) 及次级索引(Secondary Index)。次级索引目前仅实现语法支持,没有加速作用。 另外 MatrixOne 还提供了针对无主键表的排序键 (Cluster by), 它可以帮助我们提前针对需要查询的列进行排序,加速查询。
MatrixOne 支持哪些查询类型?
MatrixOne 支持大部分常用 SQL 查询:
基础查询:支持常见的分组,去重,过滤,排序,限定,正则表达式等基础查询能力。
高级查询:支持视图,子查询,联接,组合,公共表表达式(CTE),窗口函数,Prepare 预处理等高级查询能力。
聚合函数:支持常见的 AVG,COUNT,MIN,MAX,SUM 等聚合函数。
系统函数及操作符:支持常见的字符串,日期时间,数学函数及常见操作符。
MatrixOne 有哪些保留关键字?
MatrixOne 的保留关键字列表可参见关键字。
将保留关键字作为标识符使用时,必须使用反引号包裹,否则将产生报错。将非保留关键字作为标识符使用时,可以直接使用,无需使用反引号包裹。
MatrixOne 支不支持物化视图?
MatrixOne 目前不支持物化视图,在目前的 AP 性能支撑下,直接进行分析也可以获得较高的分析体验。物化视图功能也已经在 MatrixOne 的 Roadmap 中,如果您对物化视图有刚性较高的需求,欢迎给我们提 Issue 来描述您的场景:https://github.com/matrixorigin/matrixone/issues
MatrixOne 支不支持 Geometry?
目前还不支持,后续会支持。
MatrixOne 中的函数和关键字是否区分大小写?
不区分大小写。在 MatrixOne 中,只有一种情况需要区分大小写:如果你创建的表和属性带有 ``,`` 中的名称需要注意大小写。查询这个表名或属性名,那么表名和属性名也需要被包含在``里。
MatrixOne 是否支持事务?支持的事务隔离级别是什么?
MatrixOne 支持 ACID(原子性、一致性、隔离性、持久性)的事务能力,支持悲观和乐观事务,默认使用悲观事务。使用悲观事务的时候会采用 Read Committed 隔离级别,切换成乐观事务的时候会采用 Snapshot Isolation 隔离级别。
MatrixOne 中的函数和关键字是否区分大小写?
不区分大小写。在 MatrixOne 中,只有一种情况需要区分大小写:如果你创建的表和属性带有 ``,`` 中的名称需要注意大小写。查询这个表名或属性名,那么表名和属性名也需要被包含在``里。
数据导入/导出相关
如何将数据导入到 MatrixOne 中?
MatrixOne 支持与 MySQL 相同的 INSERT
数据插入语句,可以通过 INSERT
进行实时数据写入,同时也支持 LOAD DATA
的离线批量导入语句。
如何将数据从 MatrixOne 导出到文件?
在 MatrixOne 中,你可以使用 mo-dump
这个二进制工具把数据导出成 SQL 或者 csv 文件,或者使用 SELECT INTO
导出 csv
文件。
如何通过 mo-dump 工具只导出表结构?
可以在导出命令后加-no-data 参数,指定不导出数据。
使用 load data 导入的 json 对象中缺少某些字段,导入会报错吗?
会报错,导入 json 中,字段多于表中字段,可以正常导入,不过多出字段会被忽略,如果少于的话,则无法导入。
在执行 source 导入的时候导入文件是否可以写相对路径?
可以,但是是相对于您使用 mysql 客户端的当前路径,防止出错,还是建议写全路径,另需注意文件权限问题。
使用 load data 命令导入一个大文件时比较耗时,能否优化呢?
您可以在导入时候指定 PARALLEL 为 true 开启并行导入,例如,对于 2 个 G 的大文件,使用两个线程去进行加载,第 2 个线程先拆分定位到 1G 的位置,然后一直往后读取并进行加载。这样就可以做到两个线程同时读取大文件,每个线程读取 1G 的数据。也可以自己切分数据文件。
load data 导入有事务吗?
所有的 load 语句都是有事务的。
source 导入 sql 时涉及触发器和存储过程会执行生效吗?
目前如果 sql 中存在不兼容的数据类型、触发器、函数或存储过程,仍需要手动修改,否则执行会报错。
mo-dump 支持批量导出多个数据库吗?
目前仅支持导出单个数据库的备份,如果你有多个数据库需要备份,需要手动运行 mo-dump 多次。
MatrixOne 支持从 Minio 导入数据吗?
是支持的,load data 命令支持从本地文件、S3 对象存储服务以及 S3 兼容的对象存储服务中导入数据到 matrixone 中, 而 Minio 也是基于 S3 协议的,所以也是支持的,详情参见本地对象存储导入数据
MatrixOne 导入导出数据时,如果出现编码问题,导致数据乱码,我们一般是怎么解决的
由于 matrixone 默认只支持 UTF8 这一种编码且无法更改,所以在导入数据时如果出现了乱码,我们就不能通过修改数据库和表的字符集来解决,可以试着转换数据编码为 UTF8。常见的转换工具有 iconv 和 recode,比如:将 GBK 编码的数据转换为 UTF-8 编码:iconv -f GBK -t UTF8 t1.sql > t1_utf8.sql。
MatrixOne 导入导出时,需要哪些权限?
如果是租户管理员的话,通过默认角色可以直接进行导入、导出操作。普通用户的话,导入时,需要导入表的 'insert' 权限;select...into outfile 方式导出时,需要导出表的 'select' 权限;mo-dump 导出时,需要所有表 (table.) 的 'select' 权限和所有库 (database.) 的 'show tables' 权限。
权限相关
普通用户能授予 MOADMIN 角色吗?
不可以的,MOADMIN 为最高的集群管理员权限,只有 root 用户拥有。
其它
MatrixOne 中的 sql_mode
是什么?
MatrixOne 默认的 sql_mode
是 MySQL 中的 only_full_group_by
。因此默认查询语法中所有 select
的字段,除聚合函数中的字段,都必须在 group by
中出现。但是 MatrixOne 也支持修改 sql_mode
以兼容不完全规范的 group by
语法。
MatrixOne 中 show tables 无法查看临时表,如何查看是否创建成功?
目前可以通过 "show create table 临时表名" 来查看,由于临时表在创建后只在当前会话可见,在当前会话结束时,数据库自动删除临时表并释放所有空间,在它的生命周期内我们通常是可以人为感知的。
如何查看我的 Query 执行计划?
要查看 MatrixOne 对给定查询的执行情况,可以使用 EXPLAIN
语句,它将打印出查询计划。
EXPLAIN SELECT col1 FROM tbl1;
如何查看表压缩比
要查看 MatrixOne 中表的压缩比可以使用以下 sql 进行查询:
mysql> select ( sum(compress_size) + 1) / ( sum(origin_size) +1 ) from metadata_scan('db1.students', '*') m;
+---------------------------------------------------+
| (sum(compress_size) + 1) / (sum(origin_size) + 1) |
+---------------------------------------------------+
| 0.44582681643679795 |
+---------------------------------------------------+
1 row in set (0.01 sec)
表明 students 表的压缩率大约为:1-44.96%=55.04%。
NOTE: 在数据压缩过程中,如果数据尚未从内存写入到磁盘,那么此时查询得到的压缩比可能不够准确。通常情况下,数据会在 5 分钟内被写入磁盘,因此建议您待数据完成刷盘后再进行查询。