2012-04-09 13 views
5

Mam dwie tabele, jedną połączoną z Kluczem Podstawowym drugiej. W tym momencie wstawiam do tabeli A, otrzymam LAST_INSERT_ID, a następnie wstawiam do tabeli B.Używanie MySQL do wielokrotnego INSERT na połączonych tabelach

Ale mam setki rekordów do wstawienia i chcę je przyspieszyć.

W MySQL można:

INSERT INTO table_a (v1, v2, c3) VALUE (0, 1, 2); 

INSERT INTO table_a (v1, v2, v3) VALUE (4, 5, 6); 

itp, lub

INSERT INTO table_a (v1, v2, v3) VALUE (0, 1, 2), (4, 5, 6), etc dodać wiele wpisów szybciej - ale tylko na jednym stole.

Oczywiście ten drugi jest znacznie szybszy. Zastanawiam się, czy możliwe było odtworzenie tego zachowania dla mojego przykładu za pomocą dwóch połączonych tabel przy użyciu procedury składowanej i czy miałoby to równie dramatyczną poprawę wydajności:

coś takiego: wywołanie special_insert ((0, 1, 2), (4, 5, 6), itp.); lub podobne.

nie mam zapisanego doświadczenia wewnętrznego, więc jestem połowów pomysłów na jakim kierunku postępuje.

+0

SP pozwoli na symulację wielostolikowego wkładu monolitycznego. Pytanie brzmiałoby: jak można oddzielić tabelę A od danych z tabeli B na liście parametrów. –

+0

Cóż, pisząc własną procedurę przechowywaną, wiedziałbym, co oznaczałyby dane na liście parametrów ... Czy SP byłby znacznie szybszy od poszczególnych WKŁADÓW? –

+1

Nie wiem o niczym. Musiałbyś porównać obydwie metody, ale na końcu wciąż robisz dwie wstawki i nie możesz ominąć tego faktu. –

Odpowiedz

1

Po kilku dalszych badań wydaje się, że SP nie będzie oferować znaczną poprawę szybkości i nie może zaakceptować parametry masowe jak INSERT INTO

MySQL Stored Procedure vs. complex query

Ale nadal potrzebne, aby wstawić dość dużą liczbę Połączone rekordy w jednym, więc zrobiłem:

WSTAW DO WARTOŚCI (x, y) (1,2), (3,4), (5,6), ... (N-1, N)

id = GET_LAST insert_id

identyfikatory zakresie od id zidentyfikować + N, o ile używamy InnoDB tabel:

MySQL LAST_INSERT_ID() used with multiple records INSERT statement

MySQL LAST_INSERT_ID() used with multiple records INSERT statement

http://gtowey.blogspot.com/2012/02/multi-insert-and-lastinsertid.html

i

INSERT INTO b (a_id, z) WARTOŚCI (id, 2), (id + 1,4), (id + 2,6), ... (id + N, 11) , ale musisz tylko wiedzieć, jaki jest twój przyrost mysql od replikacji.

7

Oto przykład procedury przechowywania z wkładką dwa tabela zawierająca LAST_INSERT_ID().

DELIMITER // 
CREATE PROCEDURE new_person(
    first CHAR(35), last CHAR(35), email CHAR(255), tool_id INT) 
BEGIN 
START TRANSACTION; 
    INSERT INTO person(firstname, lastname, email) 
    VALUES(first, last, email); 

    INSERT INTO tasks (engineer_id, tool_id) 
    VALUES(LAST_INSERT_ID(), tool_id); 
COMMIT; 
END// 
DELIMITER ; 

CALL new_person('Jerry', 'Fernholz', '[email protected]', 1); 
+0

To bardzo zwięzły przykład SP, dziękuję, doceniam to.Czy byłoby możliwe przekazanie tablicy, na przykład: CALL new_person (("Jerry", "Fernholz", "[email protected]", 1), ("Bob", "Smith", [email protected] ", 2), (" Sally "," Wood "," me @ s.com ", 2), (" Will "," Black "," [email protected] ", 3)); ? –

+0

Nie, jakikolwiek język, którego używasz, powinien wywoływać SP za każdym razem, gdy iteruje przez tablicę. – eabraham