在MySql中使用FIND_IN_SET查询的速度

时间:2014-06-25 08:59:22

标签: mysql performance find-in-set

我从产品目录中查询了几个问题。 查询如下:

SELECT DISTINCT (cc_id) FROM cms_catalogo 
JOIN cms_catalogo_lingua ON ccl_id_prod=cc_id 
JOIN cms_catalogo_famiglia ON (FIND_IN_SET(ccf_id, cc_famiglia) != 0) 
JOIN cms_catalogo_categoria ON (FIND_IN_SET(ccc_id, cc_categoria) != 0) 
JOIN cms_catalogo_sottocat ON (FIND_IN_SET(ccs_id, cc_sottocat) != 0) 
LEFT JOIN cms_catalogo_order ON cco_id_prod=cc_id AND cco_id_lingua=1 AND cco_id_sottocat=ccs_id 
WHERE ccc_nome='Alpine Skiing' AND ccf_nome='Ski'

我注意到第一次查询平均需要4.5秒,然后变得很快。 我使用FIND_IN_SET因为在我的数据库表“cms_catalogo”中我有“cc_famiglia”,“cc_categoria”和“cc_sottocat”列,内部ID用逗号分隔(我知道它很愚蠢)。

示例:

cms_catalogo

专栏 cc_famiglia :1,2,3,4,5

cms_catalogo_famiglia

ccf_id :3

查询的减速可能是因为使用FIND_IN_SET那么?

如果没有用逗号分隔的ID而不是具有ID作为索引的表会更快吗?

但是,我无法解释为什么第一次执行查询的速度非常慢,然后加速

1 个答案:

答案 0 :(得分:3)

最好在表之间使用约束连接。所以你最好用主键连接它们。

如果您只想快速优化此查询:

  • 检查mysql中的explain select ...以查看查询的效果;
  • 为列ccc_id, ccf_id, ccs_id;
  • 添加索引
  • 添加索引后检查explain select ...

第一个MySQL查询需要花费更多时间,因为它是原始查询,下一个是高速缓存。所以你应该依赖第一个查询时间。 如果报告不复杂,则执行时间应小于50-100ms,否则可能会导致性能问题。因为我非常确定它不是您应用程序的唯一查询。