【发布时间】:2025-12-15 02:45:01
【问题描述】:
我有以下查询要优化。
SELECT count(*) AS count FROM area
INNER JOIN entity ON area.id = entity.id
INNER JOIN areacust ON area.id = areacust.id
WHERE entity.deleted=0
AND area.id > 0
所有表都有已删除的索引,ID。
现在,当我假设有 20 Lac(200 万)条记录时,查询需要大量时间才能给出结果。它在 10 到 20 秒之间。
我怎样才能更优化它。还有其他方法可以计算吗?
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE vtiger_crmentity ref PRIMARY,entity_deleted_idx entity_deleted_idx 4 const 729726 Using where; Using index
1 SIMPLE area eq_ref PRIMARY PRIMARY 4 area.id 1 Using index
1 SIMPLE areacust eq_ref PRIMARY PRIMARY 4 area.id 1 Using where; Using index
复合键的新解释
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE entity ref PRIMARY,entity_deleted_idx,comp_index deleted_idx 4 const 928304 Using index
1 SIMPLE area eq_ref PRIMARY PRIMARY 4 entity.id 1 Using index
1 SIMPLE areacust eq_ref PRIMARY PRIMARY 4 entity.idid 1 Using index
【问题讨论】:
-
发布
EXPLAIN您的查询计划 -
您是否尝试将 FORCE INDEX ..... 添加到选择中?
-
如何在这个查询中添加强制索引
-
FROM area FORCE INDEX (area.id) -
@Pramod 有一些关于那个的事情。所以首先,如果你想计算所有东西,大多数人会把它写成
COUNT(*).. 如果你只想计算一张表中的东西,你可以做count(a.id)甚至(a.*).. 但这只有在有LEFT JOINS导致有额外的行时才有意义...... MySQL 对COUNT(ID)或COUNT(*).. 的执行几乎相同,除非有 @ 987654332@ 要计算的值...如果有空值,您应该始终使用COUNT(*),因为 MySQL 知道如何更好地处理它.. 将执行时间减半。
标签: mysql sql query-optimization