这些mysql表索引更改是否合适?

时间:2012-01-29 23:33:50

标签: mysql indexing

因为我需要永久地在我的4000万行表上进行索引更改,所以我希望得到一些反馈,以确保我第一次就做好。

现在我的“收藏夹”表有3个索引:

  • (id)
  • 上的主要自动增量索引
  • item_idx(item_id) - 收藏项目的ID
  • faver_id_idx(faver_profile_id,id) - 用于显示从最新用户开始的特定用户的收藏。

要检查用户是否已“删除”特定项目,请使用此查询:

SELECT id FROM favorites 
WHERE item_id = '.mysql_real_escape_string($item_id).' 
AND faver_profile_id = '.mysql_real_escape_string($user['id']).' 
AND removed = 0

哪个正在进行互动:

Using intersect(item_idx,faver_id_idx)

这对我来说似乎效率很低,所以我正在考虑以下索引设置:

  • (id)
  • 上的主要自动增量索引
  • item_faver_idx(item_id,removed,faver_profile_id)
  • faver_id_idx(faver_profile_id,removed,id)

我看到的好处是:

  • 我可以检查用户是否在不进行交叉或表格排序的情况下保存了项目。
  • “已删除”(tinyint)列现在是索引的一部分。

我的问题:

  • 在(item_id,removed,faver_profile_id)索引中,是否有任何理由让faver_profile_id首先出现?例如,如果我正在进行以下查询..

    SELECT items.*, users.*, favorites.item_id 
    FROM items
    LEFT JOIN users ON (items.submitter_id = users.id) 
    LEFT JOIN favorites ON (items.id = favorites.item_id AND favorites.faver_profile_id = 56 AND favorites.removed = 0) 
    ORDER BY items.id desc LIMIT 26
    

    将faver_profile_id放在索引的第一位是否更好,以便它只能跳转到索引的右侧faver_profile_id部分,而不必检查多个item_id部分,然后在每个部分中扫描faver_profile_id?

  • 如果只有1-3%的行的删除值为1,那么在索引中“删除”是否有意义?基本上,一个稍微更有效的表扫描值得额外的索引大小?

我忽略了什么?

0 个答案:

没有答案