Tidb 随机取数据慢 SELECT * FROM `xxx` ORDER BY RAND() LIMIT 10;

为提高效率,提问时请尽量提供详细背景信息,问题描述清晰可优先响应。以下信息点请尽量提供:

  • 系统版本 & kernel 版本】 centos 7.0

  • TiDB 版本】 3.0

  • 磁盘型号

  • 集群节点分布】 1tidb 1pd 3tikv

  • 数据量 & region 数量 & 副本数

  • 问题描述(我做了什么)】 我库里有1100万数据,我想随机取10条数据 SELECT * FROM data_test ORDER BY RAND() LIMIT 10 用这个语句 消耗了24秒 ,太慢了

  • 关键词

可以看下这条语句的执行计划是怎样的:

explain SELECT * FROM data_test ORDER BY RAND() LIMIT 10;

这个这样子 怎么优化,或者能解释下 这个过程是什么意思么

1、先在 tikv 层进行全表扫描

2、再在 tidb 层进行过滤筛选,选择 10 条记录。

执行计划可以看下下面这篇文档:

https://pingcap.com/docs-cn/v2.1/reference/performance/understanding-the-query-execution-plan/#理解-tidb-执行计划

这个随机取数 应该怎么优化 还是不太明白啊

首先执行计划显示的是全表扫描,所以如果执行上面的语句,优化器部分目前无法优化。建议在业务层进行改造,比如先使用 where 条件筛选满足条件的若干行,从该行随机获取 10 条记录。