当前位置: 首页 > 工具软件 > MemSQL > 使用案例 >

memsql学习

阳航
2023-12-01

一. 查看memsql的分区
SHOW PARTITIONS;


二. 指数匹配(查询特性 )
CREATE TABLE a (
a1 int,
a2 int,
a3 int,
SHARD KEY (a1, a2),
KEY (a3)
);

匹配碎片键:
1. 这些查询将发送到一个分区
SELECT * FROM a WHERE a1 = 4 AND a2 = 10;
SELECT a3, count(*) FROM a WHERE a1 = 4 AND a2 = 10 GROUP BY a3;

2.这些查询将发送到所有分区
SELECT * FROM a WHERE a1 = 4;
SELECT * FROM a WHERE a1 = 4 OR a2 = 10;
SELECT * FROM a WHERE a1 IN (4, 5) AND a2 IN (10);

二级索引匹配:
SELECT * FROM a WHERE a3 = 5;

没有索引匹配:
与任何索引不匹配的查询会在所有分区上执行全表扫描

三. MemSQL INSERT通过分析与分片键相关的插入值并将执行路由到相应的分区来执行。
例如,INSERT INTO a (a1, a2, a3) VALUES (1, 2, 3)将计算哈希值(1, 2)并将此值映射到适当的分区,因为a表shard key 是a1 + a2。
如果批量插入,建议用逗号隔开批量插入
INSERT INTO a (a1, a2, a3) VALUES (1, 2, 3), (2, 3, 4), …

shard key 不支持修改。

四. 解释器模式对代码生成的影响。
1. interpreter_mode 被设置为 compile,第一次执行会产生编译开销时间,第2次和第3次则不需要编译,直接用第1次的编译计划执行。

SELECT * FROM t WHERE col = 1;
Empty set (0.13 sec)

SELECT * FROM t WHERE col = 1;
Empty set (0.00 sec)

SELECT * FROM t WHERE col = 100000;
Empty set (0.00 sec)

2. interpreter_mode 被设置为 interpret_first,并行解释和编译查询形状,查询效率更快。从MemSQL 6.8开始,默认interpreter_mode设置为interpret_first

SELECT * FROM t WHERE col = 1;
Empty set (0.02 sec)

SELECT * FROM t WHERE col = 1;
Empty set (0.00 sec)

SELECT * FROM t WHERE col = 100000;
Empty set (0.00 sec)

五. 创建表时最重要的考虑因素是其数据布局。MemSQL支持两种类型的表:内存中的行存储和磁盘上的列存储,Rowstores在随机读取和随机写入方面更胜一筹,列存储在顺序读取和顺序写入方面更胜一筹。

Rowstore表适用于搜索和并发更新。它们将所有数据保存在内存中,并将给定行的所有列保存在一起,从而在运行寻找特定行的查询时获得非常快的性能。使用rowstore,数据存储在无锁索引中,以实现高并发性能。Rowstore表可以使用多个索引,允许它们灵活地支持多种类型的查询。具有频繁更新的事务样式OLTP工作负载非常适合行存储表。

Columnstore表适用于顺序扫描。数据按列存储在磁盘上,在运行执行顺序扫描和触摸相对较少的列的查询时,可以实现良好的数据压缩和出色的性能。由于列存储表只能有一个索引(用于对每个段进行排序的列存储键),因此它们的功能不如行存储表。

通常,当您的工作负载与以下描述尽可能匹配时,列存储表是有效的:

按顺序扫描大量行(即数百万行或> 5%的表)
聚合只发生在几列(例如<10列)
小的更新和删除很少见; 大多数影响大批量的行
对于不经常更新数据的环境,应考虑使用Columnstore表,并且大多数更新都是大批量更新。频繁的单行事务样式更新对列存储表的性能不佳。

您是否需要对数据强制执行唯一约束?使用行存储并设置适当的主键。
您是否有许多不同的查询可以选择性地过滤不同的列?使用行存储并使用多个索引。
您是否寻求指向您的数据?使用行存储进行点查询。
您是否需要支持高并发更新或删除?使用行存储可以从无锁数据结构中受益。
您是否只汇总了仅批量更新或删除的大量数据?使用列存储可以获得快速性能。

基于RAM的行存储比基于磁盘的列存储更快吗?不一定 - 如果工作负载具有顺序读取(例如,具有大量扫描的分析工作负载),则列存储可以明显更快。
列存储中写入速度慢吗? 不一定 - 如果写入主要是有序的并且您不需要运行更新,那么即使对于相对较小的批次,列存储也可以比行存储一样快或甚至更快。
并发写入时,列存储库是否不正确? 这取决于磁盘的类型。旋转和固态磁盘都能很好地进行顺序写入,但是固态磁盘往往要快速写入并发; 因此,在SSD上运行的列存储在并发写入时可以非常快。
 类似资料: