我在一个相对较大的表(约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可用的资源,执行时间不变。
1条答案
按热度按时间s4chpxco1#
概要文件输出中的“Sendingdata”行证明,这7秒钟几乎全部用于在存储引擎层和SQL层之间复制数据行。
您的查询的EXPLAIN显示了检查13744857行的估计值,并且没有任何索引或资源可以改变这一点。
加快此查询的唯一方法是: