mysql 和 tidb 中 left join 时间差距较大

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。

  • 【TiDB 版本】:3.0.13
  • 【问题描述】:两个九百万的表关联 使用
SELECT
	COUNT( 0 ) 
FROM
	(
SELECT
	*
from
	bill_detail 
WHERE
	merchant_base_info_id = 112158 
	) bd
	LEFT JOIN bill_trade_detail btd ON btd.`bill_trans_no` = bd.`bill_trans_no` 
	and btd.bill_type = 2;

tidb 执行时常 3.3s mysql 执行时长 0.6s

若提问为性能优化、故障排查类问题,请下载脚本运行。终端输出的打印结果,请务必全选并复制粘贴上传。

  1. 请反馈 tidb 和 mysql 的执行计划,多谢。
  2. tidb 可以执行 explain analyze sql 查看实际的执行计划,多谢。

tidb.sql (2.1 KB)

  1. 从 tidb 执行计划看,走indexlookup join,应该也没问题
  2. 请问 tidb 和 mysql 的数据是一样的吗?
  3. mysql 和 tidb 的硬盘是否一致? 多谢。

上面的问题都是一致的,硬盘也是一样的,测试了多遍,tidb的速度明显慢于mysql

  1. 请上传两个表的表结构,同时对比 tidb 和 mysql 是否一致。
  2. mysql 的执行计划,请展示完整,多谢

new 3.txt (15.4 KB)

[问题澄清]

相同sql ,mysql 和 tidb 执行时间差距较大,sql

SELECT COUNT(*) FROM
(SELECT * from bill_detail WHERE merchant_base_info_id = 112158 ) bd
LEFT JOIN bill_trade_detail btd
ON btd.bill_trans_no = bd.bill_trans_no
and btd.bill_type = 2

[问题分析]

  1. 查看 mysql 执行计划,

  1. 查看 tidb 执行计划

  1. 可以看到使用的索引不同

(1)TABLE bill_trade_detail

KEY TRANS_TYPE_MODEL (bill_trans_no,pay_model,bill_type), — mysql

KEY ORDER_TRANS_TYPE_ (bill_trans_no,order_trans_no,bill_type,pay_model) --tidb

(2)TABLE bill_detail

KEY BILL_REPORT (merchant_base_info_id,merchant_staff_type_id,bill_statr_time,bill_end_time,expenses_item_id) USING BTREE --mysql

KEY MER_OTHER (merchant_base_info_id,other_bill_trans_no), --tidb

  1. 我们再研究下,稍后答复,多谢

谢谢,我看下

另外 想问下,tidb 的索引在选择上和mysql有啥区别

感觉应该是统计信息不准确,麻烦反馈下,两个表的统计信息,多谢,替换下参数内容。

curl http://${tidb-server-ip}:${tidb-server-status-port}/stats/dump/${db_name}/${table_name} > table_name.json

Desktop.zip (1.6 MB)

抱歉,这个问题,我们再继续查一下,会尽快答复,多谢。

1.您好,能否尝试在业务低峰期,对这两个表执行统计信息收集? ANALYZE TABLE tablename;
https://pingcap.com/docs-cn/v3.0/statistics/#手动收集

  1. 收集后,再次执行查看

我把这两个表的统计信息删除了,然后去执行这个sql可以吗

统计信息如果删除了,就更加不准确了,请先尝试收集正确的统计信息,查看 SHOW STATS_HEALTHY , 在健康度较高时,反馈下执行计划,多谢。

目前这两个表的健康度为99
tidb (2).sql (2.2 KB)

大表单纯的left join加一些筛选条件,性能对比mysql还是有比较大的差距,我尝试了指定索引的方式,使tidb和mysql走的是相同的索引,发现执行返回结果时间反而更长了,有没有tidb索引原理的文档参考下。

  1. 请问重新收集统计信息了吗?反馈下当前的统计信息,多谢

Desktop.zip (1.7 MB)

  1. 从您的反馈看,执行时间是2s多, 您说的指定和mysql 一样的索引后的执行计划,能麻烦发送下执行计划吗? 多谢。