基于 tidbV6.0 探索索引优化思路
作者: 边城元元原文来源:https://tidb.net/blog/f3ae08ad
一、背景
在分布式数据库中数据量级大都在千万以上,用到的最多的 sql 类似 where ,order by ,limit 的语句。
where,order by 的字段能否同时走索引呢?带着这个疑问基于 TiDBV6.0 做一个实验验证。
二、环境准备
2.1 建立 TiDB cluster111
拓扑如下(cluster111-full.yaml)
部署集群
具体的部署可以参考文章 https://tidb.net/blog/af8080f7#TiDB-最小实践 Cluster111
2.2 创建库表
2.3 表数据初始化
三、测试
主键忽略
3.1 二级索引 ix_orgid(orgid
)
3.1.1 where:orgid,order:id
3.1.2 where:orgid,order:cust_id
3.1.3 where:orgid,order:productid
3.1.4 where:orgid,order:catid
3.1.5 where:orgid,order:labelid
3.2 复合索引两列 ix_labelid_catid(labelid
,catid
)
3.2.1 where:labelid,order:id
3.2.2 where:labelid,order:catid
3.2.3 where:labelid,order:labelid
3.2.4 where:labelid,order:cust_id
3.2.5 where:labelid,order:productid
3.2.6 where:labelid,order:orgid
3.3 复合索引三列 ix_p1_p2_p3(p1
,p2
,p3
)
3.3.1 where:p1,order:id
3.3.2 where:p1,order:p1
3.3.3 where:p1,order:p2
3.3.4 where:p1,order:p3
3.3.5 where:p1,p2,order:p3
3.3.6 where:p1,order:labelid
3.3.7 where:p1,order:cust_id
3.3.8 where:p1,order:productid
3.3.9 where:p1,order:orgid
3.3.10 where:p1,order:catid
3.4 关于 TopN 与 limit
参考:https://docs.pingcap.com/zh/tidb/stable/topn-limit-push-down
Limit 节点等价于一个排序规则为空的 TopN 节点。
SQL 中的 LIMIT 子句在 TiDB 查询计划树中对应 Limit 算子节点,ORDER BY 子句在查询计划树中对应 Sort 算子节点,此外,我们会将相邻的 Limit 和 Sort 算子组合成 TopN 算子节点,表示按某个排序规则提取记录的前 N 项。从另一方面来说,Limit 节点等价于一个排序规则为空的 TopN 节点。
和谓词下推类似,TopN(及 Limit,下同)下推将查询计划树中的 TopN 计算尽可能下推到距离数据源最近的地方,以尽早完成数据的过滤,进而显著地减少数据传输或计算的开销。
四、总结
4.1 执行计划汇总
4.2 sql 语句建议
where 条件尽量走索引
order by 尽量避免回表
谢谢 TiDB 社区,谢谢 TiDBer,后续会探索更多的 TiDB 相关的技术!
版权声明: 本文为 InfoQ 作者【TiDB 社区干货传送门】的原创文章。
原文链接:【http://xie.infoq.cn/article/ba83a656c624696005875b9a5】。文章转载请联系作者。
评论