Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Поиск по огромной базе данных
Форумы портала PHP.SU » » Вопросы новичков » Поиск по огромной базе данных

Страниц (1): [1]
 

1. Crowley - 02 Февраля, 2014 - 19:25:26 - перейти к сообщению
Есть SSD сервер(ОЗУ - 1 гиг, процессор - 2.7 вроде(точно не помню),память - 40 гигов)
На этом SSD стоит база данных в 2 гига. Нужно осуществить поиск по ней примерно 100 значений за раз, и сделать это максимально быстро.
Какие будут советы?
2. T1grOK - 02 Февраля, 2014 - 19:34:37 - перейти к сообщению
Смотря какой поиск.

Проставить индексы, денормализовать БД, если потребуется. И накрайняк подключить Sphinx(но придется уведилить мощностя).

На одном из проектов использую Sphinx таблица 40 млн. строк (4,5Гб) нет нареканий.
3. Мелкий - 02 Февраля, 2014 - 19:47:51 - перейти к сообщению
2гб - огромная база?
Хотя бы лям записей-то в ней есть?
4. Ch_chov - 02 Февраля, 2014 - 19:49:14 - перейти к сообщению
Наверно, тип базы нужно знать.
5. Crowley - 02 Февраля, 2014 - 20:01:49 - перейти к сообщению
Немного я недооценил масштабы.
В текстовом файле(это еще не БД) 41 миллион строк(1.2 гига), почему-то я решил, что перенеся все в БД будет где-то 2 гига строк.. Я ошибся, видимо.
Нужна идея для работы с БД в 41 миллион строк.
6. caballero - 02 Февраля, 2014 - 20:20:34 - перейти к сообщению
а проблема то какая?
7. Crowley - 02 Февраля, 2014 - 20:33:51 - перейти к сообщению
caballero пишет:
а проблема то какая?

Как я понял, если обрабатывать 41 миллион строк, это будет очень долго(от 2 минут) разве нет?
8. caballero - 02 Февраля, 2014 - 20:35:17 - перейти к сообщению
смотря каких строк и смотря что подразумевается под "обрабатывать"
9. Crowley - 02 Февраля, 2014 - 20:41:01 - перейти к сообщению
caballero пишет:
смотря каких строк и смотря что подразумевается под "обрабатывать"

Строки в среднем 32 символа, но могут быть и длиннее.
Обрабатывать - искать в базе совпадения, и выводить их пользователю, если эти совпадения есть.
10. Мелкий - 02 Февраля, 2014 - 20:47:04 - перейти к сообщению
Точные совпадения? (Или хотя бы "строка начинается с ...")
Индекс повесить и всего делов.
11. Crowley - 02 Февраля, 2014 - 21:01:44 - перейти к сообщению
Мелкий пишет:
Точные совпадения? (Или хотя бы "строка начинается с ...")
Индекс повесить и всего делов.

Точные совпадения.
Значит, нужно повесить индекс(Не подскажите как? Ни разу не работал с БД) и все?
12. T1grOK - 02 Февраля, 2014 - 23:04:34 - перейти к сообщению
Crowley пишет:
Нужна идея для работы с БД в 41 миллион строк.

Crowley пишет:
Строки в среднем 32 символа, но могут быть и длиннее.
Обрабатывать - искать в базе совпадения, и выводить их пользователю, если эти совпадения есть.

Мелкий пишет:
Индекс повесить и всего делов.

Crowley пишет:
Есть SSD сервер(ОЗУ - 1 гиг, процессор - 2.7 вроде(точно не помню),память - 40 гигов)

Боюсь "тазик" слабоват будет.
13. Мелкий - 03 Февраля, 2014 - 10:09:24 - перейти к сообщению
T1grOK пишет:
Боюсь "тазик" слабоват будет.

Памяти мало, конечно, весь рабочий набор не влезет, но за глаза.
Начать с индекса по 5 символам (~625мб, если не ошибаюсь в подсчётах), по вкусу добавить-убрать.
Если вдруг что - можно эмулировать хеш-индекс по crc32, уж инты прогретыми держать памяти хватит ещё долго.

Как:
CODE (SQL):
скопировать код в буфер обмена
  1. ALTER TABLE `table` ADD INDEX ( `field` ( 5 ) )

Подробнее в мануале: http://dev[dot]mysql[dot]com/doc/refman/[dot][dot][dot]alter-table[dot]html

 

Powered by ExBB FM 1.0 RC1