高CPU使用率和表上的锁是由我的查询造成的。尽管我尝试使用各种集群索引和碎片键,但性能并没有提高。
在Memsql中,我们创建了这个表并执行了这个查询。在我的环境中,这个查询是运行速度最快的查询。请提供有关如何优化此Memsql表或查询的建议。
表:
CREATE TABLE `mobile_flow` (
`marker` varchar(8) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`teqthry` varchar(12) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`stry_on` bigint(20) NOT NULL,
`stry_clsd` bigint(20) NOT NULL,
`matr_start` bigint(20) NOT NULL,
`cost_no` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
`prc_findr` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
`cost_row` varchar(5) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
`prd_sol` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
`prd_range` double NOT NULL,
`prd_invty` double NOT NULL,
`prd_hagx` int(11) DEFAULT NULL,
UNIQUE KEY `unq_n1` (`marker`,`teqthry`,`matr_start`) USING HASH,
KEY `index_1` (marker`,`teqthry`,`matr_start`) USING CLUSTERED COLUMNSTORE,
SHARD KEY `shd_n1` (`matr_start`,`teqthry`)
);查询:
SELECT count(*)
FROM mobile_flow
WHERE matr_start<1426393500 and matr_start>=1525202400 AND teqthry='kund' AND marker in ('scpopec', 'rdeg', 'dhendqs');发布于 2022-08-26 04:55:02
您在筛选索引中使用的列是?如果没有,请尽量从过滤器中使用的列中创建尽可能多的索引。
您可以尝试重新排列筛选器的顺序,保留删除最多行数的筛选器,然后是下一个最大的筛选器。这将确保下游过滤器不需要在大量记录上工作。如果无法将所有这些列作为索引,请在顶部保留最大的索引列筛选器,然后是其他列。
发布于 2022-08-26 10:23:09
对于您的查询,您需要(marker, teqthry, matr_start)上类似BTREE的索引。这与查询模式相匹配,查询模式在前两列上搜索相等,在第三列上搜索范围扫描。单间商店的人有一个类似BTREE的结构,称为跳过者,它被称为BTREE。
您已经有了这个索引,但是它是一个集群列键,它不具有与Skiplist相同的查询计划特征。
我不能访问单一商店系统或你的数据。而且,我不是专家,所以我不能尝试这个。但你可以试试这样的方法:
ALTER TABLE mobile_flow
DROP KEY index_1
ADD KEY index_1 (marker, teqthry, matr_start) USING BTREE;如果我是你,如果这不起作用的话,我会向单身商店的支持寻求一些帮助。
发布于 2022-08-26 23:30:52
警告:以下是MySQL的建议;它可能适用于"memsql“,也可能不适用。
对于MySQL,具有多个选项的IN并不像=那样优化。
添加这两个“复合”(和“覆盖”)索引;优化器将选择哪个更好:
INDEX(teqthry, marker, matr_start)
INDEX(teqthry, matr_start, marker)用EXPLAIN SELECT ...检查它;如果它是‘覆盖’,就会说“使用索引”。
如果这是一个巨大的表,请参见还可以讨论
https://stackoverflow.com/questions/73495992
复制相似问题