Помогите советом по оптимизации быстродействия.

Solmyr
На сайте с 10.09.2007
Offline
501
320

Задача такова:

Есть две таблицы table1 и table2. Строки в этих таблицах имеют уникальные индексы, соответственно id1 и id2 (остальные данные в таблицах не имеют значения к вопросу). Количество записей в таблицах от 100 000.

Есть индексная таблица index в которую занесены попарные связи элементов из table1 и table2 то есть просто пары из id1 и id2. Количество записей в этой таблице от 10 000 000, то есть в среднем на один элемент из table1 или table2 приходится по 100 таких связей, это в среднем, так где-то от 10 до 10000.

Собственно вычислительная задача: Приходит новый элемент из table1 и информация о связях его с элементами и table2. Требуется запустить выборку по таблице index и найти те элементы из таблицы table1 у которых совпадет наибольшее количество связей с новым элементом. То есть строго говоря, нужно для каждого элемента из table1 посчитать количество совпадающих связей с новым элементом, и отобрать те, у которых количество наибольшее. Хотя для решения задачи не нужно найти все, нужно найти несколько с наибольшим количеством совпадений. Несколько это 3-10.

Вопрос состоит на данный момент в том, на каком движке баз данных это правильнее всего делать. Ограничение только одно: ОС Debian. Пока что попробовал на MySQL MyISAM и innoDB. innoDB работает гораздо медленнее (может я правда что-то не так оптимизировал), а MyISAM дохнет, если вторая задача приходит до того, как посчиталась предыдущая.

Буду благодарен за любые советы по оптимизации данной задачи.

Ragnarok
На сайте с 25.06.2010
Offline
226
#1

попробуйте сделать в index не такое соответствие

tab1[3]->tab2[5]
tab1[3]->tab2[8]
tab1[3]->tab2[234]

а такое

tab1[3]->tab2[5]|tab2[8]|tab2[234]

это в разы уменьшит объем index

Ragnarok добавил 22.04.2011 в 14:42

Solmyr:
Требуется запустить выборку по таблице index и найти те элементы из таблицы table1 у которых совпадет наибольшее количество связей с новым элементом. То есть строго говоря, нужно для каждого элемента из table1 посчитать количество совпадающих связей с новым элементом, и отобрать те, у которых количество наибольшее. Хотя для решения задачи не нужно найти все, нужно найти несколько с наибольшим количеством совпадений. Несколько это 3-10.

а ещё можно заранее высчитать вхождения и завести под них отдельную таблицу. в добавляющих/обновляющих скриптах соответственно тоже добавить обновление новой таблицы

//TODO: перестать откладывать на потом

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий