【问题标题】:Speed of query using FIND_IN_SET on MySql在 MySql 中使用 FIND_IN_SET 的查询速度
【发布时间】:2014-08-15 18:15:47
【问题描述】:

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

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 作为索引的表会更快?

但是,我无法解释为什么第一次执行查询很慢,然后又加快了

【问题讨论】:

  • 是的。 FIND_IN_SET 非常快,但它仍然无法击败正确规范化和索引的数据。加速可能是由于查询缓存。 DISTINCT 也不是函数。最后,您的命名约定还有一些不足之处,您应该尝试养成正确限定列名的习惯。
  • DINSTINCT 不是函数吗?为什么?我用它来列出不同的(不同的)值,否则我会有重复的。
  • DISTINCT 关键字是 SELECT 子句中的一个选项。它不是一个函数,因此不包含任何参数。括号不是必需的,并且可能对 DISTINCT 选项的行为没有影响。

标签: mysql performance find-in-set


【解决方案1】:

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

如果你只想快速优化这个查询:

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

第一个 MySQL 查询需要更多时间,因为它是原始查询,下一个被缓存。所以你应该依赖第一次查询时间。 如果不是复杂的报告,那么执行时间应该小于 50-100ms,否则你可能会遇到性能问题。因为我很确定这不是您的应用程序的唯一查询。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-03
    • 1970-01-01
    • 2017-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-09
    相关资源
    最近更新 更多