gpt4 book ai didi

mysql - 在 MySql 中使用 FIND_IN_SET 的查询速度

转载 作者:可可西里 更新时间:2023-11-01 08:16:42 25 4
gpt4 key购买 nike

我对产品目录的查询有几个问题。查询如下:

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

然而,我无法解释为什么第一次执行查询很慢然后加速

最佳答案

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

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

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

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

关于mysql - 在 MySql 中使用 FIND_IN_SET 的查询速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24404341/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com