使用explain优化MySQL查询



我有以下SQL

SELECT COUNT (*)从一个INNER JOIN B ON A.evnumber=B.evnumber

这是解释结果。

[
{
"id": "1",
"select_type": "SIMPLE",
"table": "A",
"type": "index",
"possible_keys": "evnumber",
"key": "evnumber",
"key_len": "768",
"ref": null,
"rows": "13926",
"Extra": "Using where; Using index"
},
{
"id": "1",
"select_type": "SIMPLE",
"table": "B",
"type": "ref",
"possible_keys": "evnumber,UserID",
"key": "evnumber",
"key_len": "768",
"ref": "A.evnumber",
"rows": "1",
"Extra": "Using where"
},
{
"id": "1",
"select_type": "SIMPLE",
"table": "D",
"type": "ref",
"possible_keys": "mdl_userinfodata_usefie_ix",
"key": "mdl_userinfodata_usefie_ix",
"key_len": "8",
"ref": "B.UserId",
"rows": "134",
"Extra": "Using where; Using index"
}

)

当我执行这个SQL时,它需要40秒。根据行列值的乘积(13926x134x1=1,866,084),我认为这是不可能的。请帮帮我,我该如何改善?MySQL版本为5.6

查询已经为连接使用索引,但它没有为b使用覆盖索引。这是我能看到的唯一可能的改进。

我将在B上为列(evnumber, user_id)添加一个复合索引。这应该允许查询get "Using index"对于表B,表示它只使用索引,它不必读取表行。它不会减少您在rows: 1中看到的表B的数目,但它将有助于使B更容易连接到d。

有时这种类型的优化会产生很好的结果。对于非常大的表,它可以大大提高性能。但是你的表很小,所以它可能不会有太大的区别。

最新更新