Нужно решение

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
Q2W
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 745
Зарегистрирован: 31.01.2004 (Сб) 20:46
Откуда: Питер

Нужно решение

Сообщение Q2W » 18.08.2005 (Чт) 14:43

Есть данные:
Слова (обычные русские или английские), для каждого из которых есть одно или несколько значений.

Слов около 50-100 тысяч.

Значений всего может быть около миллиона.

Значения не уникальны во всей этой схеме, но внутри каждого слова уникальны.

Т.е. логично построить такую таблицу:
Код: Выделить всё
+---------+----------+
|words    |values    |
+---------+----------+
|word1    |value1    |
|word1    |value2    |
|word2    |value3    |
|word2    |value1    |
+---------+----------+


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

Всё это под никсами и используя perl + mysql. СУБД впринципе для этого можно и поменять на какую-либо другую.

Дело всё в том, что эта таблица получится оччень большой и запрос соответственно займёт очень много времени.

Есть конечно вариант (может он и бредовый):
Сделать для каждого слова таблицу, в которой будут лежать только значения для нужного слова, потом запрос делать из нужных таблиц (какие слова у нас в связке) и группировать по значениям (чтоб вылезли только совпадающие).
А крутость такой фишки в том, что слова искать не надо, надо просто открыть соответствующие таблички.

Но тут возникла проблема, mySQL не может открыть больше 65536 файлов (а на одну таблицу там 3 файла).


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

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 18.08.2005 (Чт) 14:49

Три таблицы.
Код: Выделить всё
================
TABLE: LANGUAGES
----------------
LANG_ID - Long
NAME - String
----------------
INDEXES:
PK: LANG_ID
================

================
TABLE: WORDS
----------------
WORD_ID - Long
VALUE - String
LANG_LANG_ID - Long (FK на LANGUAGES.LANG_ID)
----------------
INDEXES:
PK: WORD_ID
================

================
TABLE: DICTIONARY
----------------
WORD1_ID - Long (FK на WORDS.WORD_ID)
WORD2_ID - Long (FK на WORDS.WORD_ID)
----------------
INDEXES:
PK: WORD1_ID, WORD2_ID
WORD1: WORD1_ID
WORD2: WORD2_ID
================

Что-то типа того.
Последний раз редактировалось alibek 19.08.2005 (Пт) 14:08, всего редактировалось 1 раз.
Lasciate ogni speranza, voi ch'entrate.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 18.08.2005 (Чт) 14:53

А искать примерно так:
Код: Выделить всё
SELECT W1.VALUE, W2.VALUE
FROM DICTIONARY D, WORDS W1, WORDS W2
WHERE W1.VALUE = "text"
  AND D.WORD1_ID = W1.WORD_ID
  AND D.WORD2_ID = W2.WORD_ID
Lasciate ogni speranza, voi ch'entrate.

Q2W
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 745
Зарегистрирован: 31.01.2004 (Сб) 20:46
Откуда: Питер

Сообщение Q2W » 18.08.2005 (Чт) 16:43

Я чёта ничё не понял.
alibek, объясни плз.
Я знаю верный путь

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 19.08.2005 (Пт) 8:09

А что именно непонятно?
Lasciate ogni speranza, voi ch'entrate.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 19.08.2005 (Пт) 8:21

Видимо, человеку нужно объяснить, что такое реляционная база данных, и почему она такова :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

FaKk2
El rebelde gurú
El rebelde gurú
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Сообщение FaKk2 » 19.08.2005 (Пт) 8:53

Видимо :)
Для получения ответа надо продемонстрировать качества, позволяющие стать компетентным — внимательность, вдумчивость, наблюдательность, желание активно участвовать в выработке решения.

Q2W
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 745
Зарегистрирован: 31.01.2004 (Сб) 20:46
Откуда: Питер

Сообщение Q2W » 19.08.2005 (Пт) 11:10

Ну у тебя три таблицы, и кок ты распределил в них эти данные не понятно. Какие-то Languages'ы. Непонятно.
Что такое реляционная база, так по моему мнению это когда две или больше табилиц содержат данные об одних и тех же объектах и логически соединить разную инфу из разных таблиц об одном объекте можно исползуя одинаковые индексы этих объектов в этих таблицах.
Если не так, то действительно нужно объяснить.
Я знаю верный путь

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 19.08.2005 (Пт) 11:48

Пример базы с данными.
Код: Выделить всё
================
TABLE: LANGUAGES
----------------
1 | Russian
2 | English
================

================
TABLE: WORDS
----------------
1 | пример     | 1
2 | таблица    | 1
3 | текст      | 1
4 | table      | 2
5 | exsample   | 2
6 | text       | 2
================

================
TABLE: DICTIONARY
----------------
1 | 5
2 | 4
3 | 6
================


Результат запроса с параметром "таблица":
Код: Выделить всё
SELECT W1.VALUE, W2.VALUE
FROM DICTIONARY D, WORDS W1, WORDS W2
WHERE W1.VALUE = "таблица"
  AND D.WORD1_ID = W1.WORD_ID
  AND D.WORD2_ID = W2.WORD_ID

Код: Выделить всё
таблица | table

Так понятнее?
Lasciate ogni speranza, voi ch'entrate.

Q2W
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 745
Зарегистрирован: 31.01.2004 (Сб) 20:46
Откуда: Питер

Сообщение Q2W » 19.08.2005 (Пт) 12:27

alibek писал(а):
Код: Выделить всё
SELECT W1.VALUE, W2.VALUE
FROM DICTIONARY D, WORDS W1, WORDS W2
WHERE W1.VALUE = "таблица"
  AND D.WORD1_ID = W1.WORD_ID
  AND D.WORD2_ID = W2.WORD_ID

Я вообще не понимаю синтаксис этого SQL запроса.
Разве mySQL или любая другая никсовая СУБД поддерживает его?
Я не понимаю это именование DICTIONARY D, W1.VALUE,...
Объясни плз русскими словами что делает этот запрос и что всё это значит.
Я знаю верный путь

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 19.08.2005 (Пт) 12:31

Его поддерживает любая СУБД, понимающая ANSI SQL.
Lasciate ogni speranza, voi ch'entrate.

Q2W
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 745
Зарегистрирован: 31.01.2004 (Сб) 20:46
Откуда: Питер

Сообщение Q2W » 19.08.2005 (Пт) 14:04

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

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 19.08.2005 (Пт) 14:07

Ну и что?
В таблице только ключи, отбор и поиск будет проводится очень быстро.

P.S. Я подправил исходный пост, добавил еще пару индексов.
Lasciate ogni speranza, voi ch'entrate.

Q2W
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 745
Зарегистрирован: 31.01.2004 (Сб) 20:46
Откуда: Питер

Сообщение Q2W » 19.08.2005 (Пт) 14:14

Т.е. у меня в таблице 500 000 000 записей, то такой запрос выполнится быстро???
Чёта я сильно сомневаюсь.
Я знаю верный путь

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 19.08.2005 (Пт) 14:17

А у тебя в таблице может быть 500 миллионов записей?
В любом случае, из типовых решений это одно из самых быстрых; на полмиллиарда записей уйдет секунд 5, может меньше, все зависит от настроек СУБД.
Если нужно что-то еще более быстрое, то потребуются специальные методы.
Lasciate ogni speranza, voi ch'entrate.

Q2W
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 745
Зарегистрирован: 31.01.2004 (Сб) 20:46
Откуда: Питер

Сообщение Q2W » 19.08.2005 (Пт) 14:22

MySQL на среднестатистическом сервере соседствует ещё с другими сервисами, но приоритет отдаётся ему.
Сильно сомневаюсь что он выполнит запрос за 5 секунд, ведь для этого надо прочитать минимум 4 гигабайта инфы (а примерно столько получится таблица, даже больше).

alibek писал(а):Если нужно что-то еще более быстрое, то потребуются специальные методы.


Вот как раз они мне и нужны.
Я знаю верный путь

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 19.08.2005 (Пт) 14:34

Q2W писал(а):Сильно сомневаюсь что он выполнит запрос за 5 секунд, ведь для этого надо прочитать минимум 4 гигабайта инфы (а примерно столько получится таблица, даже больше).

Зря сомневаешься. Только не путай "выбрать данные" и "получить данные на клиенте".
Lasciate ogni speranza, voi ch'entrate.

Q2W
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 745
Зарегистрирован: 31.01.2004 (Сб) 20:46
Откуда: Питер

Сообщение Q2W » 19.08.2005 (Пт) 14:41

дык отдавать он будет в результате в среднем не много, вот только перелопатить 4 гига за 5 секунд, по-моему это нереально.
Да и 5 секунд - это несколько многовато.
Я знаю верный путь

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 19.08.2005 (Пт) 14:42

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

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 19.08.2005 (Пт) 14:45

Q2W писал(а):Да и 5 секунд - это несколько многовато.

Ну блин...
Сейчас протестирую, скажу сколько будет.
Возможно даже меньше 5 секунд.
И скажи мне, откуда ты полмиллиарда записей возьмешь?
Lasciate ogni speranza, voi ch'entrate.

Q2W
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 745
Зарегистрирован: 31.01.2004 (Сб) 20:46
Откуда: Питер

Сообщение Q2W » 19.08.2005 (Пт) 14:51

За это не беспокойся, возьму.
Я знаю верный путь

Q2W
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 745
Зарегистрирован: 31.01.2004 (Сб) 20:46
Откуда: Питер

Сообщение Q2W » 19.08.2005 (Пт) 15:28

alibek писал(а):Сейчас протестирую, скажу сколько будет.

Ну как? генеришь несколькогиговую таблицу? :))
Я знаю верный путь

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 19.08.2005 (Пт) 15:44

Угу. Уже сгенерировал слова, сейчас компоную сочетания.
Lasciate ogni speranza, voi ch'entrate.

Q2W
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 745
Зарегистрирован: 31.01.2004 (Сб) 20:46
Откуда: Питер

Сообщение Q2W » 19.08.2005 (Пт) 15:52

alibek писал(а):Угу. Уже сгенерировал слова, сейчас компоную сочетания.
ГЫГЫГЫ
Я знаю верный путь

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 19.08.2005 (Пт) 16:27

Вообщем, драйверов у меня нет, их надо скачать, а поэтому жди до понедельника.
Но соединение двух таблиц, которые в итоге дают 10'514'451'600 записей (10 миллиардов) происходит за 0.45 секунд.
Lasciate ogni speranza, voi ch'entrate.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 22.08.2005 (Пн) 13:25

Добавлять полмиллиарда записей мне оказалось лень.
Но вот результаты отбора с базой; в words свыше 120 тысяч записей, в dictionary свыше 70 тысяч.

Самый тормозной, но и самый наглядный запрос:
Код: Выделить всё
select w1.value, w2.value
from dictionary d, words w1, words w2
where w1.value = 'abstract'
  and d.word1_id = w1.word_id
  and d.word2_id = w2.word_id
order by 1, 2

Выбрано четыре строки за 0.02 секунды.

Код: Выделить всё
select w.value
from dictionary d, words w
where d.word2_id = w.word_id
  and d.word1_id =
    (
      select word_id
      from words
      where value = 'abstract'
    )

Выбрано четыре строки за 0.02 секунды.

Результаты особо не отличаются, но если искать по LIKE 'a%', то разница будет где-то двух-, трехкратной.

Если будет время, то проведу тестирование с десятью миллионами записей (добавлять долго; сто тысяч генерировались 20 минут), но уверен, что запрос будет выполнятся не более 2-3 секунд.
Lasciate ogni speranza, voi ch'entrate.

Q2W
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 745
Зарегистрирован: 31.01.2004 (Сб) 20:46
Откуда: Питер

Сообщение Q2W » 22.08.2005 (Пн) 13:30

СУБД придёцца загрузить себе в память (или просто каждый раз читать из файла, что хуже) все эти данные, а весят они много.
Как он это сделает за сравнительно небольшое время.
А ещё если учесть, что одновременно может выполняться и не один такой запрос, то тормоза будут жуткие.
Я знаю верный путь

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 22.08.2005 (Пн) 13:56

Q2W писал(а):СУБД придёцца загрузить себе в память (или просто каждый раз читать из файла, что хуже) все эти данные, а весят они много.

Ты знаешь, что такое СУБД? Помоему нет.
Зачем тебе грузить в память 500 миллионов записей, можешь мне объяснить?
Lasciate ogni speranza, voi ch'entrate.

Q2W
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 745
Зарегистрирован: 31.01.2004 (Сб) 20:46
Откуда: Питер

Сообщение Q2W » 22.08.2005 (Пн) 14:02

Я себе это вижу так:
СУБД (процесс MySQL) должен из таблицы взять нужные данные.
Для этого ему надо обшарить всю таблицу, все полмиллиарда записей.

Так, нет?
Я знаю верный путь

lord0n
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 845
Зарегистрирован: 30.06.2005 (Чт) 9:55
Откуда: Moskow

Сообщение lord0n » 22.08.2005 (Пн) 14:04

нет, если мне не изменяет память, то база в память грузится кусками
в случае совпадения с условием запроса она запоминает кусок и смотрит дальше
Последний раз редактировалось lord0n 22.08.2005 (Пн) 14:06, всего редактировалось 2 раз(а).
Теория - это когда что-то не работает и известно почему.
Практика - это когда что-то работает, но неизвестно почему.
Нам удалось совместить теорию с практикой, теперь ничего не работает и неизвестно почему.

След.

Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 0

    TopList