本期实验将指导您使用PolarDB-X分布式事务和数据分区
前置准备
假设已经根据前一讲内容完成了PolarDB-X的搭建部署,可以成功链接上PolarDB-X数据库。
PolarDB-X:实践教程之如何快速安装部署PolarDB-X
体验PolarDB-X分布式事务
本步骤将带您体验PolarDB-X分布式事务。首先开启一个分布式事务,通过命令观察事务信息。然后模拟一个转账行为,观察原子性和隔离性保证,最后通过Flashback Query查看历史版本。
1.准备测试库、测试表和测试数据。
a. 执行如下SQL语句,创建测试库transfer_test并使用。
CREATE DATABASE transfer_test MODE='AUTO'; USE transfer_test;
b. 执行如下SQL语句,创建测试表account。
CREATE TABLE account ( pk bigint not null auto_increment, id varchar(64) not null, balance double not null, gmt_create timestamp default current_timestamp, gmt_modified timestamp default current_timestamp on update current_timestamp, PRIMARY KEY(pk), key(id) );
c. 执行如下SQL语句,创建测试表user 。
CREATE TABLE user ( pk bigint not null auto_increment, name varchar(64) not null, addr varchar(128) not null, gmt_create timestamp default current_timestamp, gmt_modified timestamp default current_timestamp on update current_timestamp, PRIMARY KEY(pk), key(name) );
d. 执行如下SQL语句,初始化数据。
INSERT INTO account(id, balance) VALUES("Alice", 100), ("Bob", 100); INSERT INTO user(name, addr) VALUES("Alice", "hz"), ("Bob", "sh");
e. 执行如下SQL语句,查看初始化结果。
SHOW FULL CREATE TABLE account; SHOW FULL CREATE TABLE user; SELECT * FROM account; SELECT * FROM user;
2.转账测试。
a. 实验页面,单击右上角的+ 图标,创建新的终端三和终端四。
b. 在终端三和终端四中,分别执行如下命令,连接PolarDB-X集群。
mysql -h127.0.0.1 -P3306 -upolardbx_root transfer_test
c. 按照如下表格中的步骤顺序,在终端三和终端四中分别执行如下SQL语句,进行转账测试。
步骤顺序 | 终端三的命令 | 终端四的命令 |
1 | BEGIN; UPDATE account SET balance = balance - 30 WHERE id = "Alice"; |
|
2 | SELECT * FROM account; | SHOW TRANS; SELECT * FROM account; |
3 | ROLLBACK; | |
4 | SELECT * FROM account; | SHOW TRANS; SELECT * FROM account; |
5 | BEGIN; UPDATE account SET balance = balance - 30 WHERE id = "Alice"; UPDATE account SET balance = balance + 30 WHERE id = "Bob"; |
|
6 | SELECT * FROM account; | SELECT * FROM account; |
7 | COMMIT; | |
8 | SELECT * FROM account; |
3.Flashback Query。
a. 实验页面,单击右上角的+图标,创建新的终端五。
b. 执行如下命令,连接PolarDB-X集群。
mysql -h127.0.0.1 -P3306 -upolardbx_root transfer_test
c. 执行如下SQL语句,记录当前时间点为ts0。
SELECT NOW();
d. 执行如下SQL语句,更新数据。
BEGIN; UPDATE account SET balance = balance - 30 WHERE id = "Alice"; UPDATE account SET balance = balance + 30 WHERE id = "Bob"; COMMIT; INSERT INTO account(id, balance) VALUES("Tom", 100); INSERT INTO user(name, addr) VALUES("Tom", "bj");
e. 执行如下SQL语句,查看更新后的数据。
SELECT a.id, a.balance, b.addr FROM account a JOIN user b ON a.id = b.name;
f. 执行如下SQL语句,指定时间为ts0,查询历史版本数据。
说明 :
- 您需要将{ts0}替换为实际记录的时间点ts0。
- 示例:SELECT * FROM user AS OF TIMESTAMP "2022-05-12 10:14:14";
SELECT * FROM user AS OF TIMESTAMP "{ts0}"; SELECT * FROM account AS OF TIMESTAMP "{ts0}";
g. 执行如下SQL语句,在Join中为部分表指定时间戳。
说明 :您需要将{ts0}替换为实际记录的时间点ts0。
SELECT a.id, a.balance, b.addr FROM account a JOIN user AS OF TIMESTAMP "{ts0}" b ON a.id = b.name;
h. 执行如下SQL语句,查看并记录当前时间点为ts1。
SELECT NOW();
i. 执行如下SQL语句,模拟误删操作。
DELETE FROM account WHERE 1=1;
j. 执行如下SQL语句,查看删除结果。
SELECT * FROM account;
k. 执行如下SQL语句,通过Flashback Query恢复误删的数据。
说明 :您需要将{ts1}替换为实际记录的时间点ts1。
INSERT INTO account SELECT * FROM account AS OF TIMESTAMP "{ts1}";
l. 执行如下SQL语句,查看恢复结果。
SELECT * FROM account;
体验PolarDB-X数据分区
本步骤将带您体验PolarDB-X数据分区对查询性能的影响。首先用默认拆分方式创建一张表,然后通过增加全局索引和改变拆分方式来提升查询性能。
1.准备测试库、测试表和测试数据。
a. 切换至终端二,执行如下SQL语句,创建测试库partitioning_test并使用。
CREATE DATABASE partitioning_test MODE='AUTO'; USE partitioning_test;
b. 执行如下SQL语句,创建测试表ptest1。
CREATE TABLE ptest1 ( id INTEGER UNSIGNED NOT NULL, k INTEGER UNSIGNED DEFAULT '0' NOT NULL, c CHAR(20) DEFAULT '' NOT NULL, pad CHAR(60) DEFAULT '' NOT NULL, PRIMARY KEY(id) );
c. 执行如下SQL语句,插入数据。
INSERT INTO ptest1(id, k, c, pad) VALUES (1, 1, "c", "pad"),(2, 2, "c", "pad"),(3, 3, "c", "pad"), (4, 4, "c", "pad"),(5, 5, "c", "pad"),(6, 6, "c", "pad");
2.通过全局索引优化查询性能。
a. 执行如下SQL语句,查看主键上点查的执行计划。
EXPLAIN SELECT pad FROM ptest1 WHERE id = 1;
b. 执行如下SQL语句,查看k字段上点查的执行计划。
EXPLAIN SELECT pad FROM ptest1 WHERE k = 1;
c. 执行如下SQL语句,在k字段上增加索引。
ALTER TABLE `partitioning_test`.`ptest1` ADD INDEX `__advise_index_ptest1_k`(`k`);
d. 执行如下SQL语句,查看添加索引后的执行计划。
EXPLAIN SELECT pad FROM ptest1 WHERE k = 1;
e. 执行如下SQL语句,在k字段上增加聚簇索引。
ALTER TABLE ptest1 ADD CLUSTERED INDEX c_k(k);
f. 执行如下SQL语句,查看增加聚簇索引后的执行计划。
EXPLAIN SELECT pad FROM ptest1 WHERE k=1;
g. 执行如下SQL语句,查看ptest1表的表结构。
SHOW CREATE TABLE ptest1; SHOW FULL CREATE TABLE ptest1;
3.通过变更分区键优化查询性能。
a. 执行如下SQL语句,删除之前创建的索引。
ALTER TABLE ptest1 DROP INDEX c_k; ALTER TABLE ptest1 DROP INDEX __advise_index_ptest1_k;
b. 执行如下SQL语句,变更拆分键。
ALTER TABLE ptest1 PARTITION BY HASH(k); SHOW FULL CREATE TABLE ptest1;
c. 执行如下SQL语句,查看变更拆分键之后的执行计划。
EXPLAIN SELECT pad FROM ptest1 WHERE k=1;
了解更多
- PolarDB-X强一致分布式事务原理
- PolarDB-X分布式事务的实现(一)
- PolarDB-X分布式事务的实现(二)InnoDB CTS扩展
- PolarDB-X全局时间戳服务的设计
- 分布式数据库中的一致性与时间戳
- PolarDB-X数据分布解读(一)
- PolarDB-X数据分布解读(二) :Hash vs Range
本文来源:PolarDB-X知乎号