复杂Max语句MySQL
我用一个查询从MySQL数据库中获取10个最大值。它返回了正确的值,但问题是,获取该值花费了很长时间 此值是来自设备的CPU数据。因此,从单个设备上看,大约有6种模块类型。从每个模块类型中,大约有120个模块编号。每个模块编号有2个插槽(主插槽和备用插槽)。模块编号放置在子架中。我需要获得具有最高值的10个模块编号 我尝试使用自己的查询,它返回了正确的值,但插槽不正确。然后我从堆栈溢出()中找到了一个查询 这是我的表格结构:复杂Max语句MySQL,mysql,sql,query-optimization,Mysql,Sql,Query Optimization,我用一个查询从MySQL数据库中获取10个最大值。它返回了正确的值,但问题是,获取该值花费了很长时间 此值是来自设备的CPU数据。因此,从单个设备上看,大约有6种模块类型。从每个模块类型中,大约有120个模块编号。每个模块编号有2个插槽(主插槽和备用插槽)。模块编号放置在子架中。我需要获得具有最高值的10个模块编号 我尝试使用自己的查询,它返回了正确的值,但插槽不正确。然后我从堆栈溢出()中找到了一个查询 这是我的表格结构: Create Table: CREATE TABLE `Router_
Create Table: CREATE TABLE `Router_Modul_CPU` (
`date_id` date NOT NULL,
`hour_id` time NOT NULL,
`NE` varchar(50) NOT NULL,
`modul_number` int(11) NOT NULL,
`modul_type` varchar(50) NOT NULL,
`slot` int(11) NOT NULL,
`subrack` int(11) DEFAULT NULL,
`mean_memory` float DEFAULT NULL,
`peak_memory` float DEFAULT NULL,
PRIMARY KEY (`date_id`,`hour_id`,`NE`,`modul_number`,`modul_type`,`slot`),
KEY `index_key` (`date_id`,`hour_id`,`NE`,`modul_number`,`modul_type`,`slot`,`subrack`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
这是我的问题:
select
Router_Modul_CPU.NE,
Router_Modul_CPU.modul_number,
Router_Modul_CPU.slot,
Router_Modul_CPU.subrack
from Router_Modul_CPU
inner join
(
select modul_number, max(peak_memory) as maks
from `Router_Modul_CPU`
group by modul_number, NE, subrack
) maxt on
(Router_Modul_CPU.modul_number = maxt.modul_number and
Router_Modul_CPU.peak_memory = maxt.maks)
where modul_type='SPU' and NE='R-D5-SBT' and date_id='2019-02-14'
limit 10
获取数据大约花费了40-50秒,而这些查询只针对一台设备
所有这些数据每5分钟插入此表。现在这个表有大约2500万行
是否对我的表进行了任何调整或对我的查询提出了任何建议以提高效率
谢谢您当前的查询有几个问题。首先,子查询中的
GROUPBY
子句没有多大意义。其次,在外部查询中使用LIMIT
而不使用orderby
,这也没有意义。我建议采用以下版本:
SELECT
r1.NE,
r1.modul_number,
r1.slot,
r1.subrack
FROM Router_Modul_CPU r1
INNER JOIN
(
SELECT modul_number, MAX(peak_memory) AS maks
FROM Router_Modul_CPU
GROUP BY modul_number
) r2
ON r1.modul_number = r2.modul_number AND
r1.peak_memory = r2.maks
WHERE
r1.modul_type = 'SPU' AND
r1.NE = 'R-D5-SBT' AND
r1.date_id = '2019-02-14'
我省略了LIMIT
子句,如果您想使用它,那么您还必须提供一个orderby
子句
关于如何使其性能更好,一种方法是将以下索引添加到Router\u Model\u CPU
表中:
CREATE INDEX your_idx ON Router_Model_CPU (modul_number, peak_memory);
有了这个索引,MySQL可能会选择加入它,而不是加入当前的子查询。索引应该可以使用,因为子查询只是要求每个组的
peak\u内存的最大值。@user3783243是的,这个查询的目的是为了PHP,但是我已经尝试直接从服务器使用CLI,结果还是一样的,它花费了大约40-50秒。这不管用吗<代码>。。。按值订购说明限制10
?您好,谢谢您的更正。我已经发现了问题。这花了很长时间,因为我没有在主查询中添加WHERE子句。当我尝试添加WHERE子句时,只花了大约0.7秒。在我的帖子中编辑我的查询以使其可读之后,我发现了这个更正。再次感谢你听到这个消息。如果以后再次出现性能问题,索引可能会使其速度更快。