Важный отказ от ответственности : Я проверил это на данных, представленных в вопросе. Загрузка нескольких гигабайт данных в базу данных SQLite может занять много времени. Запросы с использованием двух текстовых полей могут быть неэффективными. Может влиять производительность диска. И т. Д. И т. Д.
Следующий сценарий sh
создаст базу данных SQLlite database.db
(этот файл будет удален, если он уже существует), создать таблицы qadr
и данные
, и загрузить данные в две таблицы ( файл1
в данные
и файл2
в кадр
). Затем он создаст индекс для data.adr
.
#!/bin/sh
address_file="file2"
data_file="file1"
database="database.db"
rm -f "$database"
sqlite3 "$database" <<END_SQL
CREATE TABLE qadr ( adr TEXT );
CREATE TABLE data ( name TEXT, adr TEXT, tag1 TEXT, tag2 TEXT );
.separator :
.import "$data_file" data
.import "$address_file" qadr
VACUUM;
CREATE UNIQUE INDEX adri ON data(adr);
VACUUM;
END_SQL
Создание индекса предполагает, что адреса в file1
уникальны (то есть, что второе поле :
-delimited является уникальным). Если это не так, удалите UNIQUE
из оператора CREATE INDEX
(в идеале они уникальны, а в идеале - строки в file2
также уникальны).
Я никогда не работал с SQLite и такими объемами данных, но знаю, что многогигабайтный импорт в MongoDB и MySQL может быть очень медленным, а создание индекса также может занять много времени. По сути, я говорю, что просто бросаю это кому-то, у кого есть много данных для тестирования.
Тогда это вопрос одного простого запроса:
$ sqlite3 database.db 'SELECT data.* FROM data JOIN qadr ON (data.adr = qadr.adr)'
John|myemail@gmail.com|johnson123|22hey
или, возможно, даже просто
$ sqlite3 database.db 'SELECT * FROM data NATURAL JOIN qadr'
John|myemail@gmail.com|johnson123|22hey
Кто-то с большим знанием SQLite наверняка даст конструктивный комментарий по этому поводу.