官方文档参考:https://docs.pingcap.com/zh/tidb/stable/use-tiflash
首先我们需要进行数据的同步的副本的构建:
mysql> ALTER TABLE snap_tab SET TIFLASH REPLICA 2;
Query OK, 0 rows affected (0.51 sec)
查看副本的同步进度:
mysql> SELECT * FROM information_schema.tiflash_replica ;
±-------------±-----------±---------±--------------±----------------±----------±---------+
| TABLE_SCHEMA | TABLE_NAME | TABLE_ID | REPLICA_COUNT | LOCATION_LABELS | AVAILABLE | PROGRESS |
±-------------±-----------±---------±--------------±----------------±----------±---------+
| testdb | snap_tab | 83 | 2 | | 1 | 1 |
±-------------±-----------±---------±--------------±----------------±----------±---------+
1 row in set (0.00 sec)
AVAILABLE: 1 表示可用
PROGRESS: 1 表示完成
读取tiflsh的方法主要有2种:
- tidb
2.tispark
我们先通过TIDB的方式查询一下具有tiflash 副本的表:
通过执行计划,我们可以看到 batchCop[tiflash] 这个关键字,就是从tiflash 副本中查询的
mysql> desc select count(*) from snap_tab;
±---------------------------±--------±------------------±---------------±--------------------------------+
| id | estRows | task | access object | operator info |
±---------------------------±--------±------------------±---------------±--------------------------------+
| StreamAgg_25 | 1.00 | root | | funcs:count(Column#6)->Column#3 |
| └─TableReader_26 | 1.00 | root | | data:StreamAgg_9 |
| └─StreamAgg_9 | 1.00 | batchCop[tiflash] | | funcs:count(1)->Column#6 |
| └─TableFullScan_24 | 3.00 | batchCop[tiflash] | table:snap_tab | keep order:false, stats:pseudo |
±---------------------------±--------±------------------±---------------±--------------------------------+
4 rows in set (0.01 sec)
我们还可以通过session 级别来指定查询的存储引擎: 目前来看有3种存储引擎
engine 为 “tikv”、“tidb” 和 “tiflash”
“tidb” 表示 TiDB 内部的内存表区,主要用于存储一些 TiDB 系统表,用户不能主动使用
我们来尝试来手动指定一下: session 级别的参数tidb_isolation_read_engines
我们可以看到查询的执行计划中 已经变成了从TIKV中查询
mysql> set @@session.tidb_isolation_read_engines = “tikv”;
Query OK, 0 rows affected (0.00 sec)
mysql> desc select count(*) from snap_tab;
±---------------------------±--------±----------±---------------±--------------------------------+
| id | estRows | task | access object | operator info |
±---------------------------±--------±----------±---------------±--------------------------------+
| StreamAgg_16 | 1.00 | root | | funcs:count(Column#5)->Column#3 |
| └─TableReader_17 | 1.00 | root | | data:StreamAgg_8 |
| └─StreamAgg_8 | 1.00 | cop[tikv] | | funcs:count(1)->Column#5 |
| └─TableFullScan_15 | 3.00 | cop[tikv] | table:snap_tab | keep order:false, stats:pseudo |
±---------------------------±--------±----------±---------------±--------------------------------+
4 rows in set (0.00 sec)
我们再次指定 查询引擎为 tiflash
mysql> set @@session.tidb_isolation_read_engines = “tiflash”;
Query OK, 0 rows affected (0.00 sec)
mysql> desc select count(*) from snap_tab;
±-------------------------±--------±-------------±---------------±-------------------------------+
| id | estRows | task | access object | operator info |
±-------------------------±--------±-------------±---------------±-------------------------------+
| StreamAgg_8 | 1.00 | root | | funcs:count(1)->Column#3 |
| └─TableReader_19 | 3.00 | root | | data:TableFullScan_18 |
| └─TableFullScan_18 | 3.00 | cop[tiflash] | table:snap_tab | keep order:false, stats:pseudo |
±-------------------------±--------±-------------±---------------±-------------------------------+
3 rows in set (0.00 sec)
我们还可以指定 hint的方式来指定 tiflash,tikv
/*+read_from_storage(tiflash[snap_tab]) */
/*+read_from_storage(tikv[snap_tab]) */
mysql> desc select /*+read_from_storage(tiflash[snap_tab]) */ * from snap_tab;
±----------------------±--------±-------------±---------------±-------------------------------+
| id | estRows | task | access object | operator info |
±----------------------±--------±-------------±---------------±-------------------------------+
| TableReader_5 | 3.00 | root | | data:TableFullScan_4 |
| └─TableFullScan_4 | 3.00 | cop[tiflash] | table:snap_tab | keep order:false, stats:pseudo |
±----------------------±--------±-------------±---------------±-------------------------------+
2 rows in set (0.00 sec)
mysql> desc select /*+read_from_storage(tikv[snap_tab]) */ * from snap_tab;
±----------------------±--------±----------±---------------±-------------------------------+
| id | estRows | task | access object | operator info |
±----------------------±--------±----------±---------------±-------------------------------+
| TableReader_5 | 3.00 | root | | data:TableFullScan_4 |
| └─TableFullScan_4 | 3.00 | cop[tikv] | table:snap_tab | keep order:false, stats:pseudo |
±----------------------±--------±----------±---------------±-------------------------------+
2 rows in set (0.00 sec)
对于mpp的支持, 主要依赖于2个参数:
tidb_allow_mpp
tidb_enforce_mpp
他们的关系是
![](file:///C:/Users/JASON~1.CHE/AppData/Local/Temp/enhtmlclip/Image(2).png)
如果你想强制走MPP
mysql> set @@session.tidb_allow_mpp=1;
Query OK, 0 rows affected (0.00 sec)
如果不想走MPP
set @@session.tidb_allow_mpp=0;
如果是让优化器自行选择的话:
set @@session.tidb_allow_mpp=1;
set @@session.tidb_enforce_mpp=0;