gpt4 book ai didi

php - 获取后缀表中排名前十的装备

转载 作者:行者123 更新时间:2023-11-29 13:00:27 24 4
gpt4 key购买 nike

我一直在开发一个应用程序,显示系统中出现问题的顶级设备。为此,我创建了一个表格,例如:

---------------------      ---------------------
- equipments_201404 - - equipments_201405 -
--------------------- ---------------------
- id - - id -
- equipName - - equipName -
- dateTime - - dateTime -
- ... - - ... -
--------------------- ---------------------

这种分离必须与必须存储的数据量有关。因此,我想知道是否有办法通过查询或者通过PHP来获取前十名的装备。

最佳答案

如果您的故障报告(equipments_* 表中的条目每月少于大约十万个),那么按月将记录拆分到单独的表中,或者对表进行分区,绝对是一个糟糕的选择这个想法。MySQL 在处理包含数千万行的表方面做得很好。很好。说真的。

世界上有数以万计的成功应用程序在中等规模的 MySQL 服务器上处理这种大小的数据集。

另一方面,采用分区的系统需要不断维护。

如果您的体验与此相反,那是因为您还没有弄清楚如何正确使用索引和查询。我们无法从您的问题中得知您在日常生产中运行的查询类型,因此无法为您提供有关索引的明确建议。话虽如此,我认为在 (dateTime,id) 上放置索引是有意义的。

如果您只有一张表,而不是我建议的每月一张表,您可以这样做来获取十大设备故障。

 SELECT equipName
FROM equipments
GROUP BY equipName
ORDER BY COUNT(*) DESC
LIMIT 10

如果您想要截至目前的 6 个月期间内排名前十的故障,您可以使用此查询。

 SELECT equipName
FROM equipments
WHERE dateTime >= NOW() - INTERVAL 6 MONTH
GROUP BY equipName
ORDER BY COUNT(*) DESC
LIMIT 10

即使对于包含跨越数十年时间的数百万行的数据集,通过 (dateTime,EquipName) 上的复合索引也会使该查询变得非常高效。

实际上,您已将数据拆分为每月表。以下是你可以如何处理这个问题。第一:使用一系列UNION ALL 操作来创建一个包含所有数据的虚拟表。如果您的所有每月表格都具有相同顺序的相同列,那么这很简单,但有点无聊。

SELECT * FROM equipments_201404 UNION ALL
SELECT * FROM equipments_201403 UNION ALL
SELECT * FROM equipments_201402 UNION ALL
SELECT * FROM equipments_201401 UNION ALL
SELECT * FROM equipments_201312 UNION ALL
SELECT * FROM equipments_201311 UNION ALL
SELECT * FROM equipments_201310 UNION ALL
SELECT * FROM equipments_201309 UNION ALL
SELECT * FROM equipments_201308 UNION ALL
SELECT * FROM equipments_201307 UNION ALL
SELECT * FROM equipments_201306 UNION ALL
SELECT * FROM equipments_201305 UNION ALL
SELECT * FROM equipments_201304 /* etc etc you get the idea */

如果您发出此查询,您将获得所有记录,就像它们位于一张表中一样。然后您可以将其用作上面显示的查询中的子查询,如下所示。

 SELECT equipName
FROM (
SELECT * FROM equipments_201404 UNION ALL
SELECT * FROM equipments_201403 UNION ALL
SELECT * FROM equipments_201402 UNION ALL
SELECT * FROM equipments_201401 UNION ALL
SELECT * FROM equipments_201312 UNION ALL
SELECT * FROM equipments_201311 UNION ALL
SELECT * FROM equipments_201310 UNION ALL
SELECT * FROM equipments_201309 UNION ALL
SELECT * FROM equipments_201308 UNION ALL
SELECT * FROM equipments_201307 UNION ALL
SELECT * FROM equipments_201306 UNION ALL
SELECT * FROM equipments_201305 UNION ALL
SELECT * FROM equipments_201304 /* etc etc you get the idea */
) AS equipments
WHERE dateTime >= NOW() - INTERVAL 6 MONTH
GROUP BY equipName
ORDER BY COUNT(*) DESC
LIMIT 10

这可以让您伪造主摘要查询,使其认为它有一组统一的数据要处理。当然,索引在这里没有多大帮助。

显然,我在六个月的查询中包含了太多的每月表。你可以解决这个问题。但你需要每个月修复它。

关于php - 获取后缀表中排名前十的装备,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23426430/

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