我正在尝试理解我正在处理的MYSQL数据结构中发生的奇怪的性能行为:
EXPLAIN
SELECT
count(0)
FROM metric_values v
INNER JOIN dim_metric m ON m.dmm_id = v.dmm_id
WHERE 1=1
AND m.met_id = 1;
1 SIMPLE m ref PRIMARY,dim_metric_met_id_index,dim_metric_dmm_id_met_id_index dim_metric_met_id_index 4 const 1 Using index
1 SIMPLE v ref metric_values_dmm_id_index metric_values_dmm_id_index 4 oi_fact.m.dmm_id 1052 Using index
背景: Metric_values有接近100万行,表dim_metric有1024行。 我正在这2个表之间进行简单的连接,而且我遇到了巨大的性能问题。试图找出问题所在,我偶然发现了这种奇怪的行为。
我无法使用列met_id作为过滤器来执行JOIN。我让它运行了10分钟,由于超时而丢失了与数据库的连接,然后才得到任何结果;
对查询运行解释我可以看到正确使用了索引(我假设),并且只从metric_values中扫描了1052行。
EXPLAIN
SELECT
count(0)
FROM metric_values v
WHERE 1=1
AND v.dmm_id = (SELECT m.dmm_id FROM dim_metric m WHERE m.met_id = 1);
1 PRIMARY v ref metrics_values_dmm_id_index metrics_values_dmm_id_index 4 const 19589800 Using where; Using index
2 SUBQUERY m ref dim_metric_met_id_index dim_metric_met_id_index 4 const 1 Using index
对查询进行简单更改以使用子选择而不是JOIN我可以在~45秒后得到结果。
对修改后的查询运行解释我可以看到索引不是用于获取数据的主要资源,并且扫描了近2000万行来为我提供结果。
[]
有人可以向我解释发生了什么吗?我误解了EXPLAIN告诉我的内容吗?我可以对数据模型进行一些更改以提高查询性能吗?