【发布时间】:2018-08-06 12:08:56
【问题描述】:
我有一个查询需要很长时间才能执行。 表说明。这些表非常大,因此将在描述中给出相关列。所有列都是 varchar。
表 1 - 常规
PK - CLAIM_ID
记录数 - 2.63 Mill,表 2 - 注册
记录数 - 250 万
列 - CLAIM_ID(PK),POLICY_ID,MEMBER_ID表 3 - 成员
没有记录 - 2800 万
列 - MEMBER_ID(PK),POLICY_GROUP_ID表 4 - 政策
没有记录 - 200 万
Cols- POLICY_ID,policy_sub_general_type_id表 5 - 余额
记录数量 - 1200 万。
列
查询是
SELECT cg.CLAIM_ID,mem.Policy_group_ID ,
CAST(CASE when pol.policy_sub_general_type_id = 'PFL'
then (bal2.sum_insured - bal2.utilised_sum_insured)
when pol.policy_sub_general_type_id = 'PNF'
then (bal1.sum_insured - bal1.utilised_sum_insured)
end AS DECIMAL(10, 2) ) Balance_SI
FROM General cg
LEFT JOIN Enrol ce ON cg.CLAIM_ID = ce.CLAIM_ID
LEFT JOIN Member mem ON ce.MEMBER_ID = mem.MEMBER_ID
LEFT JOIN Policy pol ON pol.POLICY_ID = ce.POLICY_ID
LEFT join Balance bal1 ON bal1.MEMBER_ID = ce.MEMBER_ID
and bal1.MEMBER_ID is not null
LEFT join Balance bal2 ON bal2.Policy_group_ID = mem.Policy_group_ID
and bal2.Policy_group_ID is not null
GROUP BY cg.CLAIM_ID
解释声明显示
Select Type|table|Type|key|rows|Extra
_____________________________________
SIMPLE|cg |index|PRIMARY|2662233|Using Index
SIMPLE|ce |ref|index1|1|NULL
SIMPLE|mem|eq_ref|PRIMARY|1|using where
SIMPLE|pol|eq_ref|PRIMARY|1| Using Where
SIMPLE|bal1|ref|index2|3|Using Where
SIMPLE|bal2|ref|index1|1|using where
服务器参数
InnoDB_Buffer_pool - 10GB
InnoDB_Log_File_Size - 3GB
4核处理器
所有表和列都有相同的排序规则和字符集,所以这不是排序规则问题。连接列也是 varchar。解释语句显示(我假设)表的索引很好。 查询需要大约 15 分钟才能返回前 50000 行,这在此时是不可接受的。对于整个表,它仍然运行了最后 3 个小时而没有任何结果。 不知道为什么会这样。请帮忙。
【问题讨论】:
-
我在索引和加入 varchar 数据类型方面的经验非常糟糕。我使用整数 id(s) 加入,如果需要,从 WHERE 部分中的两个表中匹配 varchar id(s)
-
如果没有针对所有相关表的 SHOW CREATE TABLE 语句,实在是帮不上忙。
-
你真的需要 2662233 行的结果吗?
-
您正在按一列聚合,但选择了许多其他列,没有聚合函数。这没有意义。
-
这是一个简单的请求:-(。见meta.stackoverflow.com/questions/333952/…
标签: mysql sql indexing query-optimization