【发布时间】:2021-02-11 19:50:41
【问题描述】:
我不是 mysql 人,但我最近有机会使用它 - 我必须优化 Mysql5.7 上的一些查询(我也必须在 5.6 上涵盖这一点,但从 5.7 开始显然有更多信息解释)在 AWS Aurora 上运行。这需要很多时间,涉及一些连接等。我从切割分支开始并选择仅使用两个表开始“调试”。这些不是太大(~2M 和~1.5M 行),但一般来说,我认为它们的设计不太大(varchar(255) 列上的主键等)。
问题是我想看看,所以我使用了explain format=json,并试图从中获得任何见解。
所以,让我们这么说
select cc.id, cc.col1, cc.col2, ct.col1
from my_table cc
inner join my_table ct on ct.cc_id = cc.id
我得到了类似的东西
{
"query_block": {
"select_id": 1,
"cost_info": {
"query_cost": "5630369.56"
},
"nested_loop": [
{
"table": {
"table_name": "cc",
"access_type": "index",
"possible_keys": [
"PRIMARY"
],
"key_length": "258",
"rows_examined_per_scan": 1248725,
"rows_produced_per_join": 1248725,
"filtered": "100.00",
"using_index": true,
"cost_info": {
"read_cost": "3732979.00",
"eval_cost": "249745.00",
"prefix_cost": "3982724.00",
"data_read_per_join": "1G"
}
}
},
{
"table": {
"table_name": "ct",
"access_type": "ref",
"possible_keys": [
"cc_id_idx"
],
"key": "cc_id_idx",
"key_length": "257",
"ref": [
"cc.id"
],
"rows_examined_per_scan": 1,
"rows_produced_per_join": 1373037,
"filtered": "100.00",
"cost_info": {
"read_cost": "1373037.97",
"eval_cost": "274607.59",
"prefix_cost": "5630369.56",
"data_read_per_join": "3G"
},
"used_columns": [
"id",
"col_1",
"col_2",
...
]
}
}
]
}
}
我在理解这里究竟发生了什么方面存在问题。我认为 mysql 进行嵌套连接,它从表 cc 开始,然后对于每一行它到达 ct(access_type 是 ref 和 "rows_examined_per_scan": 1)。它使它 > 1M 次 ("rows_produced_per_join": 1373037)。那是对的吗?我一直在寻找任何文档,但我没有找到任何关于如何在加入的上下文中读取这些值的具体信息 - 也许只是我的 google-fu 不够强大。任何人都可以给我任何线索吗?
(当我正在寻找任何加速它的选项时,我想强制 mysql 进行哈希连接,这在 Aurora(我正在尝试 Aurora 2.09)上以/*+ HASH_JOIN(cc) */ 的形式可用,但它在任何情况下都不会影响查询计划 - 但对于另一个问题来说这是一个相当大的问题。)
【问题讨论】:
标签: mysql query-performance mysql-5.7 explain amazon-aurora