本文为您介绍 CSI(Column store Index)列存索引功能支持的语句和受限场景。
前提条件
内核版本为 TDSQL-C MySQL 版8.0 3.1.14及以上。
说明:
针对只读实例而言,符合版本要求的情况下,4核以上的只读实例才可以开启列存索引功能。
支持的语句
TDSQL-C MySQL 版已经实现了具备如下特征的 SQL 语句的计算下压查询处理,并在逐渐完善更多的功能场景。
功能场景 | 说明 |
单表扫描 | 对于单表扫描,支持全表扫描、索引扫描、索引范围扫描等扫描类型的正序、逆序扫描。 |
多表 join | 对于多表 Join,支持 Nested loop Join、HashJoin、Sort Merge Join 等多种 Join 算法。 |
子查询 | 对于子查询,支持非关联子查询。 |
数据类型 | 对于数据类型,支持带多种数据类型的查询,包括整型数据、字符型数据、浮点型数据、时间型数据等。 |
运算公式 | 支持算术表达式运算(+、-、*、%、/、|、&),条件表达式运算(<、<=、>、>=、<>、between/and、In 等),逻辑运算(or、and、not等),一般函数(字符函数、整型函数、时间函数等),聚合函数(count/sum/avg/min/max 等)。 |
查看下压执行计划 | 支持 Explain 查看下压执行计划,但只有在 Explain format=tree 中才能显示 COLUMNSTORE 标记。 |
功能限制
TDSQL-C MySQL 版将持续迭代 CSI 查询的能力,当前无法使用 CSI 查询的场景如下:
创建 CSI 的限制
同一张表只能创建一个 CSI 索引。
不支持使用 Generated Column、BLOB、TEXT、JSON、BIT 和 GEOMETRY 来创建 CSI。
不支持使用 COPY 算法创建或删除 CSI,或先删除再加 CSI。
非 InnoDB 表不支持创建 CSI。
对 CSI 表的 DDL 限制
不支持对 CSI 表进行分区操作。
SELECT 使用 CSI 的限制
不支持 DML 中的 SELECT,包括 INSERT ... SELECT/REPLACE ... SELECT。
不支持 CTE。
不支持窗口函数。
不支持 with rollup。
不支持 UNION。
不支持 ReadCommit 外的隔离级别的事务。
不支持加锁读语句,比如 SELECT FOR UPATE/SHARE LOCK。
不支持 Stored Procedure。
不支持 MODE_PAD_CHAR_TO_FULL_LENGTH/MODE_INVALID_DATES的SQL_MODE。
不支持 GIS 相关函数(如 SP_WITHIN_FUNC、st_distance 等)。
不支持用户自定义函数。
不支持 XML 相关函数(xml_str)。
不支持 lock 相关的函数(is_free_lock、is_used_lock、release_lock、release_all_locks、get_lock)。
注意事项
CSI 查询与普通查询执行结果存在一定的不兼容,包括以下几点。
结果集无序
当不指定 ORDER 序时,由于列存的组织方式与 BTree 的组织方式不同,返回的结果集可能与 BTR 执行的结果序不一致。实际上这符合 ANSI 的标准,但是用户对于结果集顺序敏感时,建议指定排序规则来获取与串行一致的结果。
精度与截断问题
使用 CSI 时,由于部分数据类型的存储和计算精度与 MySQL 不完全一致,因此可能会导致浮点部分产生精度差别或者产生截断,导致最终结果有细微的差别。
错误或告警提示次数可能会增多
对于在串行执行中出现错误/告警提示的查询,当使用 CSI 时采用并行执行的情况下,每个工作线程可能都会提示错误/告警,导致总体错误/告警提示数增多。
资源影响
CSI 的 buffer pool 会占系统内存空间。
CSI 的并行执行时,相比串行查询的单线程模式,并行查询会消耗更多的线程、内存和 IO 资源。
本页内容是否解决了您的问题?