Я создаю API, который отвечает на приведенный ниже запрос, но для его выполнения в среднем требуется 7,5 секунды. Может ли кто-нибудь помочь мне сделать это быстрее?
SELECT
peers.ip,
peers.datetime AS first_seen,
(SELECT MAX(datetime) FROM uptimes WHERE ip = peers.ip) AS last_seen,
peers.user_agent,
(SELECT COUNT(id) FROM uptimes WHERE ip = peers.ip) AS total_uptime,
(SELECT COUNT(id) FROM tries WHERE datetime >= peers.datetime) AS tries,
((SELECT total_uptime) / (SELECT tries)) AS average_uptime
FROM peers, uptimes
WHERE peers.ip=uptimes.ip
GROUP BY peers.ip
HAVING total_uptime > 10
ORDER BY average_uptime DESC
LIMIT 100;
Ответ API выглядит следующим образом:
[
{
"ip": "200.0.0.24",
"first_seen": "1584106440008",
"last_seen": "1584116482293",
"user_agent": "Grin++ 0.7.5",
"total_uptime": 40,
"tries": 40,
"average_uptime": 1
},
...
]
И ниже приведены таблицы, используемые в запросе:
CREATE TABLE `peers` (
`id` int NOT NULL AUTO_INCREMENT,
`ip` varchar(45) NOT NULL,
`datetime` varchar(45) NOT NULL,
`user_agent` varchar(45) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `id_UNIQUE` (`id`),
UNIQUE KEY `ip_UNIQUE` (`ip`)
) ENGINE=InnoDB AUTO_INCREMENT=772 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
CREATE TABLE `uptimes` (
`id` int NOT NULL AUTO_INCREMENT,
`ip` varchar(45) NOT NULL,
`user_agent` varchar(45) DEFAULT NULL,
`datetime` varchar(45) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `id_UNIQUE` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3567 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
CREATE TABLE `tries` (
`id` INT NOT NULL AUTO_INCREMENT,
`status` VARCHAR(45) NOT NULL,
`datetime` VARCHAR(45) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `id_UNIQUE` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3567 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;