Ограничить количество строк, размещаемых в таблице SQL - PullRequest
0 голосов
/ 30 ноября 2009

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

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

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

Ответы [ 4 ]

2 голосов
/ 30 ноября 2009

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

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

0 голосов
/ 30 ноября 2009

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

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

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

0 голосов
/ 30 ноября 2009

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

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

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

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

0 голосов
/ 30 ноября 2009

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

...