[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Структура многое ко многим (MySQL)
Страницы: 1, 2
Kusss
Помогите со структурой БД .

Есть ОКВЭД в количестве ~2700 ед. , и ОГРОМНАЯ куча ИНН (в будущем) .

Каждый ИНН может иметь от 1 до N оквэдов.
Поиск будет по группе окведов.

У меня пока идеи лучше этой нет . Учитывая что пока данных мало
CREATE TABLE IF NOT EXISTS `data_okved_inn` (
`id` int(1) NOT NULL AUTO_INCREMENT,
`company_id` int(1) NOT NULL,
`okved_cod` char(8) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `company_id` (`company_id`,`okved_cod`)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
Но тут будет просто нереальное количество строк со временем, и будут тормоза.

ну и простой запрос на выборку
SELECT 
`inn`, `name`
FROM
`company`
WHERE
`id` IN (
SELECT
`company_id`
FROM
`data_okved_inn`
WHERE
`okved_cod` IN ( /* тут список оквэдов */ )
GROUP BY
`company_id`
)
Примеры ОКВЭДОВ: '05.20.1', '10.71.1', '26.70.4'
Эли4ка
Попробовать с джинсами
И вопрос:зачем в уникальный ключ добавлять id компании?
Kusss
company_id - это число
ИНН - это char(12).
Индекс по числу быстрее поиска по тексту.

Если я не прав - поправьте.

Цитата
Попробовать с джинсами
Это как в данном примере?
comolov
Огромная куча инн это сколько?
Эли4ка
Джоинами, опечаталась.
Если будет известен ОКВЭД неужто не получится собрать запрос с джоином?
Цитата (Kusss @ 20.03.2019 - 08:55)
company_id - это число
ИНН - это char(12).
Индекс по числу быстрее поиска по тексту.

Если я не прав - поправьте.

Надо замерять. от каждой задачи по своему будет
FatCat
Цитата (Kusss @ 20.03.2019 - 00:23)
~2700 ед.

Это не много. Тормозов, я думаю, не будет.

_____________
Бесплатному сыру в дырки не заглядывают...
Kusss
Я думаю будет порядка 1кк+ компаний со временем.
Каждая компания имеет в среднем 10 окведов.

И получаем таблицу в 10 миллионов записей. В которой будет 2700 уникальных значений в одном из столбцов, и 1кк во втором.

Запрос будет не по большому количеству , а скажем от 1 до 10 (примерно в 95% случаях)
depp
автоинкримент тут не нужен в data_okved_inn.
связь один ко многим.
нужно добавить индекс на okved_cod.
Kusss
Ты не прав.
Тут именно многие ко многим , и индекс есть.

Инн -- Оквэд
1234567890 - 32
1234567890 - 33
1234567890 - 34
0987654321 - 32
0987654321 - 33
0987654321 - 50

Цифры от балды.
comolov
Протестировал аналогичный запрос на своих базах с 7кк и 4.5кк записями. Не тормозит. Выборка внутреннего селекта несколько десятков тыс. составила, и внешнего селекта тоже несколько десятков тыс. Постгрес только.
Kusss
comolov
Спасибо. Значит так и сделаю.
depp
прав.
VeRTak
Kusss

Если в IN попадает много значений, лучше от него отказаться

Цитата (comolov @ 20.03.2019 - 17:22)
Протестировал аналогичный запрос на своих базах с 7кк и 4.5кк записями. Не тормозит.


Не тормозит это сколько? свыше 1 секунды, уже считаешь тяжелый запрос
comolov
Kusss, VeRTak

select * from tab1 where col_id in (select id from tab2 where col_str ~ 'mask')


tab1 - 4кк
tab2 - 4.5кк

col_id - int с индексом
col_str - varchar с индексом

col_str ищется по рег. выражению

выборка внутреннего селекта 30к
выборка внешнего селекта 25к

время - 3.8s, с лимитом 1000 - 150ms
Kusss
Цитата
Если в IN попадает много значений, лучше от него отказаться
А как тогда сделать ? И если не сложно - с примером.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.