0

我有简单的表(MYSQL - MyISAM):

编辑:这是一个 50M 的记录表,添加新索引并不是我们能做的。

actions (PRIMARY action_id, user_id, item_id, created_at)

指数:

action_id (action_id, PRIMARY)
user (user_id)
item_user (user_id, item)
created_user (user_id, created_at)

和查询:

SELECT count(distinct item_id) as c_c from actions where user_id = 1

解释:

 1  SIMPLE  action  ref user_id,created_user    user_id 4   const   1415    

对于具有超过 1k 个条目的用户,此查询大约需要 7 秒的时间运行。有什么办法可以改善这一点?

我尝试了以下方法,但它们都更糟:

SELECT count(*) from actions where user_id =1 group by item_id
SELECT count(item_id) from actions USE INDEX (item_user) where user_id = 1 group by item_Id 
4

2 回答 2

0

如果您使用的是 PHP,您能否将查询简化为以下内容:

SELECT distinct item_id 
FROM actions 
WHERE user_id = 1

然后用于mysql_num_rows获取结果中的行数?

尽管需要更多工作,但您可以尝试的另一种选择是:

1-创建另一个表,该表将保存为每个找到的总行数user_id。这意味着您必须创建一个包含两列的表,一列是 the user_id,第二列是total在上一个表中找到的项目。

2-安排一个作业运行,例如每 1 小时运行一次,并使用从“操作”表返回的总数更新表。此时,您可以像这样查询新创建的表:

SELECT total
FROM actions_total
WHERE user_id = 1

当您需要最终结果时,这会快得多,因为您处理的是单行而不是数千行。这里的缺点是您可能无法获得准确的结果,具体取决于您需要多久运行一次工作。

3-如果您决定不使用工作。实际上,您仍然可以使用新创建的表,但每次插入/删除到“操作”表时,都需要更新(递增/递减)其总数。

注意:只是想帮忙

于 2013-10-27T03:22:02.473 回答
0

您可以测试以下内容:

SELECT count(*) as c_c 
   from (
       SELECT distinct item_id 
       from actions where user_id = 1
        ) as T1
于 2013-10-25T17:04:36.960 回答