Mysql 使用左连接加速简单SQL查询

Mysql 使用左连接加速简单SQL查询,mysql,sql,join,Mysql,Sql,Join,下面的查询需要56秒才能返回18行。该表包含大约14200条记录。该表包含42500条记录。标准语言包含8条记录 如果我删除两个左连接,它工作得很快。在实际的搜索查询中,会有使用criteria\u兴趣和criteria\u语言表的条件 对于criteria\u interests和criteria\u languages表,除了主键之外,我不能有任何索引,因为cid字段不是唯一的。有人知道怎么加快速度吗 SELECT criteria.id, criteria.uid FROM user_

下面的查询需要56秒才能返回18行。该表包含大约14200条记录。该表包含42500条记录。标准语言包含8条记录

如果我删除两个左连接,它工作得很快。在实际的搜索查询中,会有使用criteria\u兴趣和criteria\u语言表的条件

对于criteria\u interests和criteria\u languages表,除了主键之外,我不能有任何索引,因为cid字段不是唯一的。有人知道怎么加快速度吗

SELECT criteria.id, criteria.uid
FROM   user_profile
       INNER JOIN criteria
               ON ( criteria.id = user_profile.cid )
       LEFT JOIN criteria_interests
              ON ( criteria_interests.cid = user_profile.cid )
       LEFT JOIN criteria_languages
              ON ( criteria_languages.cid = user_profile.cid )
GROUP  BY criteria.id
LIMIT  0, 18 
以下是解释的结果:


您可以索引非唯一字段。事实上,我会索引你正在加入或搜索的每个领域。我不知道。谢谢我将尝试一下。我添加了两个新索引,并决定将criteria.uid更改为唯一字段。以前我计划将保存的搜索存储为条件记录,但为了加快速度,我将使用一个单独的表来保存搜索。新的index和criteria.uid作为一个独特的字段修复了所有滞后问题,现在速度非常快!谢谢你的提示。如果可以的话,把你的建议写在答案里,我会把它标记为接受。我真的很感激。我只是假设索引必须包含唯一的值。还在学习这些东西…你为什么要加入criteria_兴趣和criteria_语言?除了使查询变慢之外,它们对查询没有任何影响-从用户配置文件中选择criteria.id、criteria.uid,其中criteria.id=user\u profile.cid GROUP BY criteria.id LIMIT 0、18将产生相同的结果,而不使用左join,正如您所知,没有ORDER BY子句,查询返回的确切结果可能会更改,恕不另行通知。此外,您当前的语句似乎依赖于一个危险的mySQL“功能”-总是1指定列作为GROUP BY子句的一部分,或者2在聚合函数中引用该列。根据查询与表布局的不同,任何其他内容都可能在没有警告的情况下给出细微错误的结果。