acuitong
(Acuitong)
2020 年5 月 22 日 11:36
1
为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【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
若提问为性能优化、故障排查 类问题,请下载脚本 运行。终端输出的打印结果,请务必全选 并复制粘贴上传。
acuitong
(Acuitong)
2020 年5 月 25 日 05:58
5
上面的问题都是一致的,硬盘也是一样的,测试了多遍,tidb的速度明显慢于mysql
yilong
(yi888long)
2020 年5 月 25 日 08:16
8
[问题澄清]
相同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
[问题分析]
查看 mysql 执行计划,
查看 tidb 执行计划
可以看到使用的索引不同
(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
我们再研究下,稍后答复,多谢
acuitong
(Acuitong)
2020 年5 月 25 日 08:32
10
另外 想问下,tidb 的索引在选择上和mysql有啥区别
yilong
(yi888long)
2020 年5 月 25 日 09:35
11
感觉应该是统计信息不准确,麻烦反馈下,两个表的统计信息,多谢,替换下参数内容。
curl http://$ {tidb-server-ip}:${tidb-server-status-port}/stats/dump/${db_name}/${table_name} > table_name.json
yilong
(yi888long)
2020 年5 月 25 日 13:43
13
抱歉,这个问题,我们再继续查一下,会尽快答复,多谢。
yilong
(yi888long)
2020 年5 月 26 日 02:07
14
1.您好,能否尝试在业务低峰期 ,对这两个表执行统计信息收集? ANALYZE TABLE tablename;
https://pingcap.com/docs-cn/v3.0/statistics/#手动收集
收集后,再次执行查看
acuitong
(Acuitong)
2020 年5 月 27 日 01:55
16
我把这两个表的统计信息删除了,然后去执行这个sql可以吗
yilong
(yi888long)
2020 年5 月 27 日 02:04
17
统计信息如果删除了,就更加不准确了,请先尝试收集正确的统计信息,查看 SHOW STATS_HEALTHY , 在健康度较高时,反馈下执行计划,多谢。
acuitong
(Acuitong)
2020 年5 月 27 日 02:27
18
目前这两个表的健康度为99
tidb (2).sql (2.2 KB)
大表单纯的left join加一些筛选条件,性能对比mysql还是有比较大的差距,我尝试了指定索引的方式,使tidb和mysql走的是相同的索引,发现执行返回结果时间反而更长了,有没有tidb索引原理的文档参考下。