Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySql] indexy w tabeli
Forum PHP.pl > Forum > Bazy danych > MySQL
damian39
na jednej z kolumn mam utworzony index przez co zapytania select w laczeniu z innymi tabelami sie szybko wykonuja

problem jest natomiast w sytuacji gdy probuje dodac dużą ilosc danych do tabeli gdzie jeszt utworzony index
zapytanie insert gdy nie ma indexu wykonuje sie w okolo 10 sek
a gdy jest index to samo zapytanie trwa około 140 sek

kilka pytan:
  1. czy to normalna sytuacja?
  2. w jaki sposob mozna poprawic efektywnosc tego zapytania?
  3. czy za kazdym razem przy dodawaniu czegos do tabelki jak w niej jest index to zostaje on przeliczany, czy w jaki sposob to dziala?
  4. gdzie fizycznie tworzone są indexy?
mmmmmmm
1.tak
2. przed duzym insertem wywalic index, potem zalozyc na nowo
3. tak
4. chyba zalezy to od ENGINE tabeli
Crozin
Cytat
przed duzym insertem wywalic index, potem zalozyc na nowo
Przede wszystkim wszystkie zapytania należy objąć pojedynczą transakcją (co notabene i tak powinno być robione) by uniknąć przebudowywania indeksu przy każdym zapytaniu. Dopiero później można się pach w tak drastyczne posunięcia.
Xelah
Ciekawy artykuła na temat działania indeksów masz tutaj:
http://use-the-index-luke.com/sql/dml/insert

plus dokumentacja MySQL:
https://dev.mysql.com/doc/refman/5.7/en/insert-speed.html

Co do rozwiązania tego problemu, to bez szczegółów nie wiele można powiedzieć. Wywalanie indeksu przed insertem ma sens tylko wtedy, kiedy nie masz w tym samym czasie innych operacji na tej samej tablicy. Inacze wydajność i tak poleci na twarz.
damian39
@Crozin
tak wlasnie jest zrobione, jest jeden insert

co do usuwanie i tworzenia indexu to juz tak wlasnie zrobilem
problem powstaje jednak taki (jak juz napisal @Xelah) co jezeli ktos generuje jakies inne zapytania do tabeli w tym czasie jak ja dodaje

czy da sie to w jakis sposob rozwiazac zachowujac odpowiednia wydajnosc
Crozin
1. Możesz pokazać jak w tej chwili to robisz? Jak rozumiem wykonujesz jedno zapytanie INSERT z wieloma rekordami, a nie wiele INSERT-ów z pojedynczymi?
2. Możesz skorzystać z LOAD DATA INFILE.
damian39
w ten sposob
Kod
INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);


czy przez LOAD DATA INFILE masz na mysli dodawanie tych rekordow z jakiegos pliku
jesli tak to chyba nie za bardzo, bo zanim wysylam zapytanie to sprawdzam jescze rozne rzeczy w tablicy, chyba ze mozna by tam podpiac tablice
Crozin
Tak mam na myśli wczytanie tego z pliku:
Cytat
When loading a table from a text file, use LOAD DATA INFILE. This is usually 20 times faster than using INSERT statements.
Także zamiast wysyłać dane do bazy, możesz zapisać je w pliku, a następnie kazać bazie wczytać je z niego.
damian39
pomysl napewno warty sprawdzenia, dzieki
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.