gpt4 book ai didi

mysql性能问题

转载 作者:行者123 更新时间:2023-11-29 02:03:23 24 4
gpt4 key购买 nike

我有一个没有连接的简单查询,运行速度非常慢(20 秒以上)。查询的表有大约 400k 行,并且对 where 子句中使用的所有列进行了索引。

SELECT deals.id, deals.title, 
deals.amount_sold * deals.sale_price AS total_sold_total
FROM deals
WHERE deals.country_id = 33
AND deals.target_approved = 1
AND deals.target_active = 1
AND deals.finished_at >= '2012-04-01'
AND deals.started_at <= '2012-04-30'
ORDER BY total_sold_total DESC
LIMIT 0, 10

自上周以来我一直在努力解决这个问题,请给我一些帮助:)

更新 1

id  select_type table   type    possible_keys   key key_len ref rows    Extra
1 SIMPLE deals index_merge NewIndex3,finished_at_index,index_deals_on_country_id,index_deals_on_target_active,index_deals_on_target_approved index_deals_on_target_active,index_deals_on_target_approved,index_deals_on_country_id 2,2,5 \N 32382 Using intersect(index_deals_on_target_active,index_deals_on_target_approved,index_deals_on_country_id); Using where; Using filesort

最佳答案

要改进选择,请按指定顺序使用 WHERE 子句中的列创建以下复合索引:

(country_id, target_approved, target_active, finished_at)
(country_id, target_approved, target_active, started_at)

您首先需要具有较高基数的列,最后是范围。 MySQL 不能 utilize any key parts past the first range ,这就是为什么我们在 WHERE 子句(>=<=)的范围内有两个不同的索引。

如果 MySQL 没有通过索引合并使用两个索引,那么您可以考虑删除其中一个。

不幸的是,MySQL 仍然必须返回所有行,计算 total_sold_total,然后才能对行进行排序。换句话说,MySQL 在检索到整个数据集后必须手动对行进行排序。

排序所需的时间将与结果集的大小成正比。

不能使用 LIMIT 优化,因为 LIMIT 是在排序之后应用的。

不幸的是,在您的 WHERE 子句中设置范围会阻止您将预先计算的 total_sold_total 列添加到索引的末尾以返回已排序的结果,这将阻止手动排序。

关于mysql性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10854993/

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