课程名称:3.7.4 TiDB Indexes(TiDB 的索引)
学习时长:
30分钟
课程收获:
了解 TiDB 中的索引以及使用和管理这些索引的方式。
课程内容:
一、TiDB indexes overview
1.Unique indexes and primary indexes
- 唯一索引
- 代表索引列的值都是唯一的
- 可以插入多个Null值
- 主键索引
- 逻辑上是唯一索引加上非Null值的约束
*聚束索引
- 红色部分为索引的key,蓝色部分为索引的value
- 在MySQL innodb存储引擎中主键就是聚束索引
- 逻辑上是唯一索引加上非Null值的约束
- 非聚束索引
- 由两部分组成,第一部分为上面的主表其中他的key(row_id)由数据库自动生成;下面一部分为主键索引其中(key)对应的value是主表的key
- 如果查询a列的值为查询条件时可能会出现回表操作,先去主键索引中查找row_id,然后回到主表中查找到b和c
- 大多数情况下,聚束索引要比非聚束索引好
- 如果主键上有热点时,聚束索引无法通过shard_row_id打散热点,非聚束索引可以打散热点
- TiDB4.0中主键索引要为聚束索引需要具备以下两点
- alter-primary-key值为false
- 主键必须是一个整数的列
- 在TiDB 5.0会完整的支持聚束索引(支持char、decimal)
- Multiple-Column indexes
- 索引可以建立在多个列上,在某些情况下可以加速查询
- 最左前缀匹配原则
- 首先创建一个索引建立在三个列上(a,b,c)
- 最左前缀原则,这个索引可以用在(a)、(a,b)和(a,b,c)三种情况下
- 如果查询条件是用在以上三种情况下是可以用上多列索引
- 表达式索引
- 表达式索引非常有用且强大,与一般的索引不同,他可以建立在表达式上,对于复杂查询非常有用
- 以上示例中查询使用了%(模糊匹配)可以通过表达是索引为其建立索引
- 前缀索引
- 前缀索引为在索引列中值的前面一部分
- 可以支持CHAR、VARCHAR、BINARY和VARBINARY这四种类型指定
- 对于BLOB和TEXT必须指定
- 优点为可以获得更好的查询性能,且存储占用小
二、TiDB Index management
- Index related system tables
- information_schema.tidb_indexes
*show index from table_name
- Indexes hints
- Use a specified index
USE INDEX([idx1_name][, idx2_name…]) - 示例
- select * from t use index(t1);
- select * from t force index(t1);
- Ignore index
IGNORE INDEX([idx1_name][, idx2_name…]) - 示例
- select * from t ignore index(t1);
- select * from t use index();