gpt4 book ai didi

php - 优化 MySQL 报表查询

转载 作者:行者123 更新时间:2023-11-28 23:20:27 25 4
gpt4 key购买 nike

我有一些查询需要超过 30 分钟才能执行,我不是数据库专家所以我真的不知道该怎么做,我需要有人建议更好的查询:

select count(*),substring(tdate,1,7) 
from bills
where amt='30'
group by substring(tdate,1,7)
order by substring(tdate,1,7) desc

SELECT count(*)
FROM `bills`
where amt='30'
and date(tdate)=date('$date')
and stat='RENEW'
and x1 in (select `id` from sub);

这里我以下面的格式 'Y-m-d 00:00:00' 传递 $date 的值

select count(*),substring(tdate,1,7) 
from bills
where amt='30'
group by substring(tdate,1,7)
order by substring(tdate,1,7) desc

表结构:

MariaDB [talksport]> desc bills;
+-------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+----------------+
| bid | int(11) | NO | PRI | NULL | auto_increment |
| num | varchar(500) | NO | | NULL | |
| stat | varchar(500) | NO | | NULL | |
| tdate | varchar(500) | NO | | NULL | |
| x1 | varchar(500) | NO | | NULL | |
| amt | varchar(500) | NO | | 30 | |
+-------+--------------+------+-----+---------+----------------+

欢迎任何帮助。

迈克尔

最佳答案

您的三个查询实际上是两个(第一个和第三个相同)。这些是您的三个查询(重新格式化以便可读):

select count(*), left(tdate, 7)
from bills
where amt = '30'
group by left(tdate, 7)
order by left(tdate, 7) desc;

select count(*)
from `bills`
where amt = '30' and date(tdate) = date('$date') and stat = 'RENEW' and
x1 in (select `id` from sub);

首先,您需要为第一个查询在 bills(amt, tdate) 上建立索引。第二个问题更大。在某些版本的 MySQL 中,in 可能是一个问题。此外,日期算术是有问题的。因此,如果您将 tdate 存储为 YYYY-MM-DD,则以相同的格式传入 $date(更好的是,使用参数,更好的是使用正确的类型)。所以,我会这样写:

select count(*)
from `bills` b
where amt = '30' and tdate = '$date' and stat = 'RENEW' and
exists (select 1 from sub s where b.x1 = s.id);

那么你想要一个关于 bills(amt, stat, tdate, id) 的索引。

正确的索引应该可以加快您的查询速度。

关于php - 优化 MySQL 报表查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41910095/

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