|
MySQL.RU - Webboard
Вернуться
Эффективно выбрать самую старую запись. (Po4emu4ka) 16/12/2015 - 16:52:45
Re: Эффективно выбрать самую старую запись. (Akina) 17/12/2015 - 09:31:27
Re: Эффективно выбрать самую старую запись. (Po4emu4ka) 17/12/2015 - 12:15:10
Re: Эффективно выбрать самую старую запись. (Po4emu4ka) 17/12/2015 - 13:22:19
Re: Эффективно выбрать самую старую запись. (Akina) 17/12/2015 - 14:06:19
Re: Эффективно выбрать самую старую запись. (Akina) 17/12/2015 - 14:07:04
Re: Эффективно выбрать самую старую запись. (Po4emu4ka) 17/12/2015 - 14:32:06
Re: Эффективно выбрать самую старую запись. (Akina) 17/12/2015 - 19:11:11
> Original message text:
> From: Po4emu4ka - 16/12/2015 - 16:52:45
> Subject:Эффективно выбрать самую старую запись.
> -----------------
> Всем доброе время суток. Столкнулся с задачей, которую хотелось бы обсудить не только внутри своей головы. :)
>
> Есть таблица.
> CREATE TABLE `ippool` (
> `ip` int(10) unsigned NOT NULL,
> `username` bigint(20) unsigned DEFAULT NULL,
> `iprange_id` smallint(5) unsigned NOT NULL,
> `active` tinyint(3) unsigned NOT NULL,
> `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
> `locked` tinyint(3) unsigned NOT NULL DEFAULT '0',
> `session_id` int(10) unsigned DEFAULT NULL,
> `nsapi` tinyint(3) unsigned DEFAULT '5',
> PRIMARY KEY (`ip`),
> UNIQUE KEY `username2` (`username`,`iprange_id`,`nsapi`),
> KEY `ts_idx` (`ts`)
> ) ENGINE=InnoDB DEFAULT CHARSET=latin1
>
> В ней примерно миллион ip-адресов. Задача: максимально эффективно выбрать самый старый свободный (active=0, locked=0) IP-адрес c заданным iprange_id.
>
> Не модифицируя таблицу, имхо, это сделать невозможно в принципе. Попытался поиграться с партициями, но как-то не вышло.
> Запрос, который пытаюсь улучшить:
> select * from ippool where active=0 and locked=0 and iprange_id in (1) order by ts desc limit 1;
>
> Буду рад, если у кого-то возникнут идеи по делу...
>
From: Po4emu4ka - 17/12/2015 - 13:22:19
Subject:Эффективно выбрать самую старую запись.
-----------------
Мудрил, мудрил.. А стоило добавить индекс по iprange_id + ts и всё заработало...
CREATE TABLE `ippool` (
`ip` int(10) unsigned NOT NULL,
`username` bigint(20) unsigned DEFAULT NULL,
`iprange_id` smallint(5) unsigned NOT NULL,
`active` tinyint(3) unsigned NOT NULL,
`ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`locked` tinyint(3) unsigned NOT NULL DEFAULT '0',
`session_id` int(10) unsigned DEFAULT NULL,
`nsapi` tinyint(3) unsigned DEFAULT '5',
PRIMARY KEY (`ip`),
UNIQUE KEY `username2` (`username`,`iprange_id`,`nsapi`),
KEY `iprangets_idx` (`iprange_id`,`ts`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
> explain select * from ippool where active=0 and locked=0 and iprange_id in (1) order by ts desc limit 1;
+----+-------------+--------+------+---------------+---------------+---------+-------+--------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------+------+---------------+---------------+---------+-------+--------+-------------+
| 1 | SIMPLE | ippool | ref | iprangets_idx | iprangets_idx | 2 | const | 125874 | Using where |
+----+-------------+--------+------+---------------+---------------+---------+-------+--------+-------------+
и выполняется моментально... Только непонятно, откуда rows 125874. В данном пуле 65535 записей.
[Это сообщение - спам!]
Последние сообщения из форума
Уважаемые посетители форума MySQL.RU!
Убедительная просьба, прежде чем задавать свой вопрос в этом форуме, обратите внимание на разделы:
- ответы на наиболее часто задаваемые вопросы - FAQ
- раздел документация
- раздел поиск по сообщениям форума и документации
Также, старайтесь наиболее подробно указывать свою ситуацию (версию операционной системы, версию MySQL,
версию программного обеспечения, по которому возникает вопрос, текст возникающих ошибок, и др.)
Помните, чем конкретнее Вы опишете ситуацию, тем больше шансов получить реальную помощь.
43463
|
|