PTCP 备考学习 --如何使用TIFLASH

官方文档参考: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种:

  1. 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;