p0is0n
Новичок
Оптимизация запросов, выборка новых клиентов.
Доброе время суток, столкнулся с такой проблемой.
Есть таблица:
Записей примерно 10 000 000 обновляется каждую секунду (просто инсерты)
Мне нужно с этой таблицы выбрать `whos` за последнюю минуту, но которых небыло раньше) тоесть новых за последнюю минуту.
Есть два варианта запросов:
план:
план:
в среднем оба запроса выполняются ~3 секунд. Возможно ли что то сделать? 3 секунды это критично...
Доброе время суток, столкнулся с такой проблемой.
Есть таблица:
PHP:
CREATE TABLE `stat` (
`id` int(11) unsigned NOT NULL auto_increment,
`bot` varchar(50) NOT NULL,
`whos` varchar(50) NOT NULL,
`type` enum('icq','jabber','mrim') NOT NULL,
`cmd` varchar(20) default NULL,
`message` text NOT NULL,
`time` timestamp NOT NULL default CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `cmd_idx` (`cmd`),
KEY `whs_idx` (`whos`),
KEY `tim_idx` (`time`),
KEY `wts_idx` (`time`,`whos`)
) ENGINE=MyISAM;
Мне нужно с этой таблицы выбрать `whos` за последнюю минуту, но которых небыло раньше) тоесть новых за последнюю минуту.
Есть два варианта запросов:
PHP:
SELECT COUNT(*) FROM (SELECT
DISTINCT `whos`
FROM `stat` WHERE `time` >= NOW() - INTERVAL 1 MINUTE) `a`
LEFT JOIN `stat` `b` ON `b`.`whos` = `a`.`whos` AND `b`.`time` <= NOW() - INTERVAL 1 MINUTE WHERE `b`.`whos` IS NULL
PHP:
+----+-------------+------------+-------+-------------------------+---------+---------+--------+-------+-------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------+-------+-------------------------+---------+---------+--------+-------+-------------------------------------------+
| 1 | PRIMARY | <derived2> | ALL | NULL | NULL | NULL | NULL | 56974 | |
| 1 | PRIMARY | b | ref | whs_idx,tim_idx,wts_idx | whs_idx | 152 | a.whos | 1 | Using where; Not exists |
| 2 | DERIVED | stat | range | tim_idx,wts_idx | wts_idx | 4 | NULL | 74338 | Using where; Using index; Using temporary |
+----+-------------+------------+-------+-------------------------+---------+---------+--------+-------+-------------------------------------------+
PHP:
SELECT
COUNT(DISTINCT `a`.`whos`)
FROM `stat` `a` WHERE `a`.`time` >= NOW() - INTERVAL 1 MINUTE AND (
SELECT
`id`
FROM `stat` WHERE `time` < NOW() - INTERVAL 1 MINUTE AND `whos` = `a`.`whos` LIMIT 1
) IS NULL
PHP:
+----+--------------------+-------+-------+-------------------------+---------+---------+--------------+-------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+--------------------+-------+-------+-------------------------+---------+---------+--------------+-------+--------------------------+
| 1 | PRIMARY | a | range | tim_idx,wts_idx | wts_idx | 4 | NULL | 79403 | Using where; Using index |
| 2 | DEPENDENT SUBQUERY | stat | ref | whs_idx,tim_idx,wts_idx | whs_idx | 152 | arx_1.a.whos | 1 | Using where |
+----+--------------------+-------+-------+-------------------------+---------+---------+--------------+-------+--------------------------+