mariadb 对索引表进行简单的聚合查询,其中14M行需要很长时间

brtdzjyr  于 2023-06-22  发布在  其他
关注(0)|答案(1)|浏览(119)

我在一个相对较大的表(约1400万行)上运行简单的聚合查询时遇到了麻烦。问题SELECT stageID, SUM(time) as totalTime FROM <table> GROUP BY stageID中的查询结果为4052行,耗时约7秒。从11.0.2-MariaDB运行mysql,客户端15.2 for Win 64(AMD 64),在本地机器上,16 GB RAM,i7芯片。数据在SSD驱动器上,所以我不明白发送数据所需的时间。
使用EXPLAIN EXTENDED SELECT ...
| id|选择类型|表|类型,类型|可能键|键|键透镜|参考|行|过滤的|额外的|
| - -----|- -----|- -----|- -----|- -----|- -----|- -----|- -----|- -----|- -----|- -----|
| 1|简单||指数|空值|唯一密钥|八|空值|13744857|一百|空值|
使用EXPLAIN <table>:
| 现场|类型|零|钥匙|默认|额外的|
| - -----|- -----|- -----|- -----|- -----|- -----|
| 阶段ID| int(11)|否|PRI|空值||
| 玩家ID| int(11)|否|PRI|空值||
| 时间|int(11)|否||0||
包括的指标:UNIQUE KEY (stageID, playerID) FOREIGN KEY (stageID) FOREIGN KEY (playerID)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci
下面是该查询的概要文件:
| 工作状态|持续时间|
| - -----|- -----|
| 启动|0.000050|
| 检查权限|0.000005|
| 开幕桌|0.000013|
| 打开table后|0.000003|
| 系统锁定|0.000005|
| 表锁|0.000005|
| 初始化|0.000017|
| 正在优化|0.000007|
| 统计数据|0.000021|
| 准备|0.000015|
| 排序结果|0.000007|
| 执行中|0.000002|
| 发送数据|6.893190|
| 更新循环结束|0.000010|
| 查询结束|0.000003|
| 提交|0.000004|
| 关闭表|0.000003|
| 解锁表|0.000002|
| 关闭表|0.000007|
| 开始清理|0.000002|
| 释放物品|0.000003|
| 更新状态|0.000039|
| 重置下一个命令|0.000004|
使用my-huge.ini配置文件等升级MariaDB可用的资源,执行时间不变。

s4chpxco

s4chpxco1#

概要文件输出中的“Sendingdata”行证明,这7秒钟几乎全部用于在存储引擎层和SQL层之间复制数据行。
您的查询的EXPLAIN显示了检查13744857行的估计值,并且没有任何索引或资源可以改变这一点。
加快此查询的唯一方法是:

  • 通过在WHERE子句中使用索引条件来减少所检查的行。但这将是一个不同的问题。我假设您需要查询来对所有stageId的所有行求和。
  • 通过删除或存档一些行来减少此表中存储的行。
  • 使用汇总表记录总和,并在主表中行更改时保持更新。更新汇总表可能仍然需要7秒,但您不必在每次读取时重新计算总和。
  • 换台更快的电脑。

相关问题