索引介绍
索引是数据库查询加速的一项重要能力。为充分满足不同业务的查询需求、提升整体查询性能,TDSQL Boundless 的只读分析实例全面支持基于列存的二级索引能力。当前支持以下三种索引类型:
Zonemap Index:系统内置的区域索引,自动维护,无需用户创建。
Bloom Filter Index:基于布隆过滤器的跳数索引,适合等值查询加速。
Bitmap Index:基于位图的索引,适合多维分析、即席查询等场景。
通常来说,对高基数列且低选择率的谓词查询创建索引,能大幅减少查询扫描的数据量,从而显著优化查询速度。
注意:
Zonemap Index 由系统自动维护,用户无需创建,也无法通过 SQL 主动创建或删除。Zonemap Index
Zonemap Index 属于系统内置索引,用户无需对其进行任何配置。系统会针对每一列、每一个数据块自动记录最大值、最小值以及是否包含 NULL 等统计信息。对于等值查询(
=)、范围查询(>、<、>=、<=、BETWEEN)以及 IS NULL 等场景,优化器可以利用最大值、最小值和 NULL 标识判断数据文件或数据块是否包含满足条件的数据。如果不包含,则跳过对应的文件或数据块。通过这种方式,可减少不必要的 I/O 开销,有效加速查询过程。Bloom Filter Index
Bloom Filter Index 是基于布隆过滤器(Bloom Filter)的一种跳数索引。它利用布隆过滤器快速判断指定数据块中是否可能存在等值查询条件命中的数据,对不可能命中的数据块直接跳过,从而减少 I/O、加速查询。布隆过滤器是一种空间效率较高的概率型数据结构,用于检查一个元素是否属于某个集合。对单个元素的查询,布隆过滤器返回的结果只有两种:可能存在或一定不存在。
适用场景
Bloom Filter Index 适用于等值查询(= 和 IN)的加速,对高基数字段(不同值数量较多的字段)效果更佳。限制条件
Bloom Filter Index 仅对 = 和 IN 谓词有加速效果,对 !=、NOT IN、>、<、LIKE 等其他谓词无效。仅支持以下字段类型:
整数类型:
SMALLINT、MEDIUMINT、INT、BIGINT(不支持 TINYINT)定点数类型:
DECIMAL字符串类型:
CHAR、VARCHAR、TEXT 等时间类型:
DATE、TIME、DATETIME不支持基于表达式创建索引。
不支持多列联合索引,每个索引只能基于单个列创建。
不支持在系统库的表上创建。
使用索引
执行查询时,如果
WHERE 条件中的等值谓词或 IN 谓词所涉及的字段已创建 Bloom Filter Index,优化器会自动应用该索引进行查询加速,无需用户显式指定。相关命令
创建索引
CREATE INDEX [IF NOT EXISTS] 索引名称 USING BLOOM_FILTER ON 表名 (列名);
删除索引
DROP INDEX [IF EXISTS] 索引名称 ON 表名;
查看索引
-- 方式一:查看建表语句SHOW CREATE TABLE 表名;-- 方式二:查看表上的所有索引SHOW INDEX FROM 表名;-- 方式三:查询元数据SELECT * FROM information_schema.STATISTICSWHERE TABLE_SCHEMA = '库名' AND TABLE_NAME = '表名';
Bitmap Index
Bitmap Index 是用位图表示的索引,对列的每个键值建立一个位图。相对于其他索引,Bitmap Index 占用的存储空间较小,构建和查询效率较高;但其修改操作的锁粒度较大,不适合频繁更新的场景。适用场景
适合建立在值重复度较高的列上。建议列的不同值数量在100到100000之间,例如:职业、地级市等。重复度过高时,相比其他索引类型优势不明显;重复度过低时,空间效率和查询性能均会下降。
适合多条件组合查询的场景。例如以下查询:
SELECT COUNT(*) FROM usersWHERE city = '南京市' AND job = '医生' AND device_type = 'iphone' AND gender = '男';
如果在每个查询条件列上都建立了
Bitmap Index,数据库可以通过高效的位运算(AND / OR)精确定位目标数据,减少磁盘 I/O。筛选后的结果集越小,Bitmap Index 的优势越明显。适合即席查询、多维分析等分析型场景。例如,一张包含100个列的宽表,业务需要使用其中20个列作为查询条件(任意组合),可在这20个列上分别建立
Bitmap Index,使所有相关查询都能受益于索引加速。不适用场景
值重复度较低的列,例如:身份证号码、手机号码等。
重复度过高的列,例如:性别。可以建立索引,但不建议作为单独查询条件使用,建议与其他条件组合过滤。
频繁更新的列。
限制条件
Bitmap Index 支持以下谓词:=、!=、>、<、>=、<=、IN、IS NULL、IS NOT NULL。多谓词组合时,AND 连接可获得最佳剪枝效果。仅支持以下字段类型:
整数类型:
TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT定点数类型:
DECIMAL字符串类型:
CHAR、VARCHAR、TEXT 等时间类型:
DATE、TIME、DATETIME不支持基于表达式创建索引。
不支持多列联合索引,每个索引只能基于单个列创建。
不支持在系统库的表上创建。
相关命令
创建索引
CREATE INDEX [IF NOT EXISTS] 索引名称 USING BITMAP ON 表名 (列名);
删除索引
DROP INDEX [IF EXISTS] 索引名称 ON 表名;
查看索引
-- 方式一:查看建表语句SHOW CREATE TABLE 表名;-- 方式二:查看表上的所有索引SHOW INDEX FROM 表名;-- 方式三:查询元数据SELECT * FROM information_schema.STATISTICSWHERE TABLE_SCHEMA = '库名' AND TABLE_NAME = '表名';