前言
这里采用了tpc-h一个数据库的数据量来进行查询计划的对比。并借助tpc-h中的22条查询语句进行执行计划分析。
mysql采用的是标准安装,TiDB采用的是单机测试版,这里的性能结果不能说明其性能差异
本文章主要目的是对比Mysql与TiDB在执行sql查询时的差异。
mysql版本5.7 TiDB版本v2.0.0-rc.4
准备阶段
数据导入TiDB后是缺少统计信息的:
SHOW STATS_META
可以手工进行统计信息的刷新
ANALYZE TABLE nation,region,part,supplier,partsupp,customer,orders,lineitem
刷新后再次查看SHOW STATS_META
首先选择Q17做为例子,进行查询
select sum(l_extendedprice) / 7.0 as avg_yearly from lineitem, part where p_partkey = l_partkey and p_brand = 'Brand#23' # 指定品牌。 BRAND=’Brand#MN’ ,M和N是两个字母,代表两个数值,相互独立,取值在1到5之间 and p_container = 'MED BOX' # 指定包装类型。在TPC-H标准指定的范围内随机选择 and l_quantity < ( select 0.2 * avg(l_quantity) from lineitem where l_partkey = p_partkey );
part表是20万 P_PARTKEY是主键,而lineitem是600万
mysql的查询时间大概是1秒左右,TiDB的查询时间大概是30秒,对比发现mysql在建立约束时,会自动创建一个索引。
mysql的执行计划:
mysql首先对part表进行了查询,由于经过where的处理20万数据已经被过滤到几百条了。再与lineitem关联,最后再处理子查询。
查询过程中借用了主键关联,所以
TiDB的执行计划