2009-11-30 6 views
-1

Это проблема с дизайном таблицы. У меня есть таблица, в которой хранятся IP-адреса. Данные в таблице запрашиваются очень сильно. IP-адреса могут иметь разные флаги, такие как «разблокировано», «временно заблокировано» и «постоянно заблокировано». 95% - 99% IP-адресов не имеют на них какого-либо блока.Ограничить количество строк, размещенных в таблице SQL

Есть ли способ ограничить # строк в таблице без исключения каких-либо данных - сохраняя все данные в одной таблице?

Мне было предложено использовать значения с разделителями-запятыми в одном из полей (я предполагаю, что с разблокированными IP-адресами). Однако я не знаком с этой техникой.

+1

«Ограничьте число строк», я предполагаю, что вы имеете в виду, «держите # строк в таблице как минимум» –

ответ

0

Я думаю, у вас должна быть таблица со списком уникальных IP-адресов. У вас также должен быть другой для транзакции на таких IP-адресах, как («разблокировано», «временно заблокировано» и «постоянно заблокировано»).

0

У вас на самом деле проблема с производительностью на этой таблице?

Ключ здесь - индексирование; предполагая, что вы индексируете на основе IP или флагов (или обоих), вы должны иметь возможность быстро запрашивать любые строки, которые вам нужны, независимо от количества строк.

Если вы обеспокоены производительностью, но вам необходимо сохранить данные, вы всегда можете иметь две таблицы: одну для IP-адресов с флагами, одну для незакрашенных строк. Вам понадобится набор procs/триггеров для вставки/удаления строк по мере изменения состояний флага.

Не используйте запятую-отдельную вещь. Он делает запрос для отдельных IP-адресов гораздо более трудоемким (не говоря уже о том, чтобы иметь дело с одной и той же проблемой, связанной с изменениями флагов ...)

2

Являются ли URL-адреса IP-адресов строковыми URL-адресами, например http://www.Amazon.com, или они являются фактическими пунктирными квадрантами обозначение? если они являются последними, и если вы делаете это, чтобы попытаться повысить производительность, подумайте о сохранении 32-разрядного целочисленного представления IP-адреса вместо четного представления строки в квадрате. (Используете ли вы IP4-адреса или IP6-адреса?

Репрезентация строки xxx.xxx.xxx.xxx занимает 15 байт, 32-битное целое число принимает только 4. Добавьте байт для вашего statusFlag, и у вас есть таблица, только 5 байтов.Это должно быть достаточно полным, чтобы иметь в нем все возможные IP4-адреса (4 млрд.).

0

В чем разница между адресом, который не указан в вашей таблице, и разблокированным адресом? большое количество адресов разблокировано, тогда, может быть, вы должны представить это, если они отсутствовали из таблицы?

В противном случае, если вы храните адреса IPv4 (а не доменные имена), возьмите предложение Charles Bretanas и сохраните его e адресуется как сырые целые числа. Если это так, вы можете добавить еще 32-разрядное целое для сетевой маски, поэтому вы можете хранить целые диапазоны (т. Е. Блокировать каждый адрес 10.0.0.0 - 10.255.255.255, вы храните адрес 10.0.0.0 как одно целое и netmask 255.0.0.0 как другое целое число). Это может значительно сократить количество строк (в зависимости от вашего поведения блокировки), но также делает эффективный запрос для конкретного адреса более сложным.

Те же базовые технологии могут применяться и для адреса IPv6, за исключением того, что они длиннее.