【发布时间】:2014-06-13 14:07:08
【问题描述】:
我有两张桌子(实际上更多,但只对这两张感兴趣)。
USER_ACTION (ID, ID_USER, ID_ACTION, TMST) AS A
ACTION (ID, DATA, NUM_USERS) AS B
但是,B.NUM_USERS 实际上是 USER_ACTION 中 A.ID_ACTION = B.ID 的记录数的表示
这是否可以作为性能优化(一个非常常见的查询经常恢复 ACTION 数据),或者因为这破坏了关系模型,所以这是一个坏主意,查询应该是:
SELECT B.ID, B.DATA, count(*) AS NUM_USERS
FROM ACTION B JOIN USER_ACTION A ON A.ID_ACTION = B.ID
WHERE B.ID = ?
GROUP BY B.ID
如果第二个选项是正确的答案,我应该放置任何索引来优化这个查询吗?
-- 编辑--
使用当前模型运行解释后,但匿名(选择操作的 8 个用户):
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE B const PRIMARY PRIMARY 8 const 1
1 SIMPLE A ref FK_USER_ACTION FK_USER_ACTION 8 const 8 Using index
【问题讨论】:
-
A.ID_ACTION和B.ID的数据类型是什么? -
所有ID都是
BIGINT,B.DATA其实是很多字段 -
在 mysql 上运行以下命令并分享问题的结果,
explain SELECT B.ID, B.DATA, count(*) AS NUM_USERS FROM ACTION B JOIN USER_ACTION A ON A.ID_ACTION = B.ID WHERE B.ID = ? GROUP BY B.ID,硬编码 B.ID 的一些值 -
查看查询缓存 (dev.mysql.com/doc/refman/5.5/en/query-cache.html)。如果您没有太多不同的 ID_ACTION,那么这可能对您有用,而无需离开严格的数据库模型。
-
@AbhikChakraborty 为查询添加了解释...看起来不错,不是吗?
标签: mysql database-administration