Поиск в большом CSV или MySQL

Статус
В этой теме нельзя размещать новые ответы.

mailmoney

Новичок
Здравствуйте. Есть задача csv файл 1 гб примерно размер, в нем 100 млн записей.
Мне нужно вывести запрос есть ли в нем строка или нет. Попробовал на VPS - написал bash - скрипт, который сначала импотирует в mysql записи - впринципе быстро "load data local infile", но вот запрос в базу -

Код:
"SELECT * FROM table WHERE a="'.$_POST[a].'" and b="'.$_POST.'" LIMIT 1"
- проходит достаточно долго (для моей задачи), нужен моментальный ответ, а тут выходит около 3-10 сек.

В какую сторону можно еще посмотреть? Может быть есть готовый вариант проверить бинарного поиска по файлу? (мне нужно оценить время поиска), или кто предложит как оптимизировать БД.

В бд только 2 поля "a" и "b". Нужно вывести либо есть совпадение либо нет.
 

mailmoney

Новичок
Фанат,скажите а есть иные варианты.. попробовал индексы.. Скорость загрузки увеличилась в десятки или сотни раз, при этом занимает очень много места под индексы. У меня закончилось свободное место на ВПС - проверить не вышло насколько эффективно. Проверяю пока на другом сервере. Быть может есть способ прямого поиска или индексирования csv файла?
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
или у тебя на vps 2гб места, или ты сделал индексов больше, чем я видел в жизни, или у тебя не 1 гб данных, или ты что-то недоговариваешь.

вообще, тебе надо почитать про размерность индексов и данных в базе и посчитать сколько нужно.
дешево и быстро большие объемы данных не обрабатываются
 

mailmoney

Новичок
Data185.5MiB
Index183.7MiB
Total369.1MiB
Rows8,103,495

вот сейчас часть запустил данных, 1/10 файла. 100 мб. итого получается около 400 мб на 100 мб файла. не сложно подсчитать что 10 таких частей потребуют 4 гб. сам файл csv на диске 1гб. Итого 5 гб на операцию. Да на впс места было не много, + что то еще лежало.
 

mailmoney

Новичок
так... вроде бы разобрался с импортом в БД, нашел еще способ

Код:
$command = "grep -wi  '0001,1234567' file.csv";
echo "<br><br><b>Результат поиска</b><br><br>";
system($command);
работает, но да... есть вероятность что при нагрузке скорость уменьшится.

в общем буду пробовать делать импорт, скажите а индексы, если у меня два varchar поля - делать два индекса, или один составной?
 

smpl

Новичок
я подобную задачу когда то решал по импорту больших csv
я делал построчное чтение из csv файла
читал по строчно с помощью fgetcsv нужен соответсвенно handler на фаил по строчное чтение, можной обойтись и без бд но читаться фаил будет не очень быстро (по моему опыту около 1 - 2 секунд думаю до 5 секунд) ну и добавлять сравнение уже туда, к сожалению код для чтения данных построчно из csv не сохранился но там обычный итератор был где каждый раз данные брались из файла и затирались преведущие.

по поводу индексов ответ один составной в порядке идущем в where (но использовать тут mysql слишком монструозно)
 

Фанат

oncle terrible
Команда форума
кодировку поля поменяй на однобайтную. если там не русский текст
и длину поля задай нормальную, а не "шоб було"
 

mailmoney

Новичок
спасибо. vps сменил побольше... задача решается за 10 минут - мне достаточно. делаю импорт
Код:
$query  = "load data local infile 'file.csv'
  into table asd
  fields terminated by ','
  enclosed by ','
  lines terminated by '\n'
  (a, b);";

mysql_query($query) or die('query failed');
на файл 1 гб - 90 млн записей, вышло с индексами 3,5 гб. впринципе теперь когда нужды места нет - все нормально. думаю даже буду две таблицы оставлять , чтобы одна рабочая - вторая импортировалась (чтобы на 10 минут сервис не пропадал)

fgetcsv - и построчную запись, это я не знаю, басни, я пробовал это вчера засечь время, 1/10 файла примерно 1 час импортировалась. данные все те же самые - таблица аналогичная с индексами.
 

AnrDaemon

Продвинутый новичок
Во-первых, надо отключать implicit commit, во-вторых отключать индексы, когда импортируешь кучу данных.
 

mailmoney

Новичок
Зачем отключать если в них и суть? Чтобы потом обратно индексировать?
 

mailmoney

Новичок
он и так идет быстро. 10 минут достаточно. а что потом? убрал индексы.. а потом заново запустить индексирование? или вы не читали суть сверху...
 

mailmoney

Новичок
вообще, мой вопрос исчерпан. можно не отвечать. проблема была только в размере индексов и месте на сервере. все решилось добавлением диска на 20 гб.
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху