Быстрая вставка MYSQL зависит от флага отдельной таблицы - PullRequest
1 голос
/ 28 мая 2010

Для работы я имею дело с большой базой данных (160 миллионов + строк в год, данные за 10 лет) и имею затруднения; Большой процент загружаемых нами данных - это нулевые данные, и я бы хотел, чтобы они не загружались.

Данные, о которых идет речь, носят пространственный характер, поэтому у меня есть одна таблица, например:

idLocations (Auto-increment int, PK)
X (float)
Y (foat)
Alwaysignore (Bool)

Который используется в качестве ссылки во второй таблице, например:

idLocations (Int, PK, "FK")
idDates (Int, PK, "FK")
DATA1 (float)
DATA2 (float)
...
DATA7 (float)

Итак, в идеале я хотел бы найти метод, где я мог бы сделать что-то вроде:

INSERT INTO tblData(idLocations, idDates, DATA1, ..., DATA7) VALUES (...), ..., (...)
WHERE VALUES(idLocations) NOT LIKE (SELECT FROM tblLocation WHERE alwaysignore=TRUE
ON DUPLICATE KEY UPDATE DATA1=VALUES(DATA1)

Итак, для моей большой партии входных данных (250 значений в блоке) игнорируйте вставки, где idLocations совпадает со значениями idLocations, помеченными Alwaysignore.

У кого-нибудь есть предложения?

Приветствия. -Stuart

Другие подробности: Запуск MySQL на полуотделенном компьютере, движок MyISAM для таблиц.

Ответы [ 2 ]

1 голос
/ 28 мая 2010
INSERT
INTO    tbldata
SELECT  *
FROM    (
        SELECT  :id1 AS id, :data1 AS id
        UNION ALL
        SELECT  :id2 AS id, :data2 AS id
        UNION ALL
        …
        ) q
WHERE   q.id NOT IN
        (
        SELECT  id
        FROM    tbllocation
        WHERE   alwaysignore
        )
ON DUPLICATE KEY
UPDATE
SET     data1 = VALUES(data1),
        …

Замените :id1, :data1 и т. Д. В подзапросе своими значениями.

0 голосов
/ 28 мая 2010

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

SELECT `x`, `y` FROM `locations` WHERE `alwaysignore` = 1;

и кешируете x / y, возможно, даже в виде строки вроде: "x_y".затем, когда дело доходит до вставки, вы просто проверяете, существует ли это значение, и если да, то ничего не делайте в mysql.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...