gpt4 book ai didi

mysql - 处理大量数据时 MySql 中的查询性能

转载 作者:行者123 更新时间:2023-11-29 10:48:17 25 4
gpt4 key购买 nike

我有一个包含 20000 条数据的表。我必须创建新表来计算一些有关分析的记录。在新表中我必须创建 25 列。我从中创建了查询和脚本,根据我的条件计算所有记录。但最后三栏需要很多时间。我已经优化了计算其他 23 列的查询。现在最后三列的查询如下:(1)每年不续订

select  count(*)
from payment
where (find_in_set('Standard',product)
OR find_in_set('Lite',product)
OR find_in_set('Basic',product)
OR find_in_set('Nifty50',product)
OR find_in_set('NiftyOnly',product)
)
AND '" + subscriptionDate + "' NOT BETWEEN subscr_date AND end_date
AND payment_type ='annual'
HAVING (MIN(subscr_date) < '" + subscriptionDate + "');

(2) 对于非续订季度:

select  count(*)
from payment
where (find_in_set('Standard',product)
OR find_in_set('Lite',product)
OR find_in_set('Basic',product)
OR find_in_set('Nifty50',product)
OR find_in_set('NiftyOnly',product)
)
AND '" + subscriptionDate + "' NOT BETWEEN subscr_date AND end_date
AND (payment_type ='quarter'
OR payment_type='Quarterly'
)
HAVING (MIN(subscr_date) < '" + subscriptionDate + "');

(3) 未续订月份:

select  count(*)
from payment
where (find_in_set('Standard',product)
OR find_in_set('Lite',product)
OR find_in_set('Basic',product)
OR find_in_set('Nifty50',product)
OR find_in_set('NiftyOnly',product)
)
AND '" + subscriptionDate + "' NOT BETWEEN subscr_date AND end_date
AND payment_type ='month'
HAVING (MIN(subscr_date) < '" + subscriptionDate + "');

我使用 find_in_set() 仅检查产品。这 3 个查询将在 while 循环下运行,并且该循环将迭代 20000 个数据。现在我怎样才能减少这个查询的执行时间?

最佳答案

您似乎有一列product,它必须是以逗号分隔的产品名称字符串。

您无法使用索引优化此查询。这是 many reasons why storing comma-separated lists of values is a bad idea 之一在关系数据库中。

想想电话簿。如果我要求您查找电话簿中名字为“Karan”的所有条目,则很难做到。它们可以位于书中的任何位置,而不是组合在一起,因为条目的排序顺序不是按名字排列的。

当您像您一样在逗号分隔列表中搜索条目时,也会遇到类似的问题。您要查找的值可能位于列表的开头、末尾或中间。即使列上有索引,它也不能使用索引的排序顺序来查找逗号分隔列表中间或末尾的条目。

如果您想搜索列表中的各个元素,则不应使用逗号分隔的列表。您应该将每行一个元素存储在引用您的付款表的第二个表中。

这是一个非常基本的数据库规范化实践,如果您想做数据库设计,您应该学习它。这可能就是为什么草莓认为发布他完全无益和轻蔑的评论是合适的(尽管他/她错了——粗鲁永远不合适)。

关于mysql - 处理大量数据时 MySql 中的查询性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44180358/

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