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

这些mysql表索引更改是否合适?,mysql,indexing,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_str

因为对我的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
正在做一个interect:

Using intersect(item_idx,faver_id_idx)
这在我看来效率很低,因此我正在考虑以下索引设置:

id上的主自动增量索引 项目\u faver\u idx项目\u id,已删除,faver\u配置文件\u id faver_id_idx faver_profile_id,已删除,id 我看到的好处是:

我可以检查用户是否在不进行intersect或table排序的情况下伪造了项目。 删除的tinyint列现在是索引的一部分。 我的问题是:

在项目id、移除、faver\U profile\U id索引中,是否有任何理由将faver\U profile\U 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,那么在索引中删除有意义吗?基本上,稍微高效一点的表扫描是否值得额外的索引大小?
我忽略了什么?

这是MyISAM表还是InnoDB表?您经常对该表运行哪些其他查询和语句?@ypercube:InnoDB我在favorites表上运行的唯一查询是从特定faver_profile_id获取收藏夹,并按id desc排序,我在上面发布的查询是相交的,所以需要一个包含faver_profile_id第一部分的索引。如果您只想为某个特定用户删除=0项,则需要一个以faver_profile_id开头的索引,removed。。。很好。所以,您可能只需要一个faver_profile_id,removed,item_id索引,这些查询就可以了,不需要从表中读取任何内容,只需要索引。