Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] Długi czas zapytania-ilość rekordów
Forum PHP.pl > Forum > Bazy danych
bogdanofnascie
Witam exclamation.gif

W tabeli mam ponad 16000 rekordów do których kolejno wykonuje zapytania (UPDATE).
Skrypt wykonujący te 16000 zapytań trwa około godziny i mam pytanie czy jest jakieś sposób aby wykonywało się to szybciej questionmark.gif

Po testach wyszło mi że im wiecej rekordów w tabeli tym dłużej trwa pojedyncze zapytanie.
Raczej nie mogę podzielić tej tablicy na kilka mniejszych :/
tomeksobczak
masz w tabeli indeksy na polach kotrych szukasz?
wklej jakies przyklady, nikt nie zgadnie czemu cos Ci wolno dziala
kris2
mozesz podzielic na kilka updatow
poniewaz wtedy tranzakcja bedzie mniejsza.
Coraz wiekszy update zajmuje coraz wiecej zasobow poniewaz baza danych musi moc w kazdym momencie zrobic rollback winksmiley.jpg
nevt
A możesz przybliżyć zapytanie UPDATE ?
Trochę dziwne, że musisz je wywoływać 16000 razy w skrypcie - pokaż je - może uda sie je zooptymalizować...
bogdanofnascie
już się robi Panowie winksmiley.jpg

  1. <?php
  2. $result = mysql_query(
  3. UPDATE ranking7 SET teamID='$teamID',leagueID='$leagueID',teamName='$teamName',arenaCapacity='$capacity',points='$points',wins='$wins',draws='$draws',loses='$loses',gScores='$bs',gLost='$bl',ranq='$ranq',lposition='$lposition',league='$leagueName' WHERE teamID='$teamID'&#092;")
  4. or die("Query failed\");
  5. ?>


zapytanie jak zapytanie, nic skomplikowanego

16k zapytan bo tyle jest zespołów :]

mozesz podzielic na kilka updatow
poniewaz wtedy tranzakcja bedzie mniejsza.



niestety juz wiem ze mi nic to nie da bo np.

zapytanie odnoszace sie do tabeli majacej 128 rekordow trwa około 0.02s a zapytanie do tabeli ktora ma te 16k rekordów trwa już 0.1s, róznica jak widac jest spora

Rekordów 16 384 Długość rekordu ø 82 Rozmiar rekordu ø 93 bajtów
xarr
A wklej info o tabeli.

Wpisz show create table ranking7;
bogdanofnascie
CREATE TABLE `ranking7` (\n `ID` int(10) unsigned NOT NULL auto_increment,\n `teamID` int(11) NOT NULL,\n `teamName` text NOT NULL,\n `leagueID` int(8) NOT NULL,\n `arenaCapacity` int(11) NOT NULL,\n `points` int(2) NOT NULL,\n `wins` int(2) NOT NULL,\n `draws` int(2) NOT NULL,\n `loses` int(2) NOT NULL,\n `gScores` int(11) NOT NULL,\n `gLost` int(11) NOT NULL,\n `ranq` int(11) NOT NULL,\n `lposition` int(2) NOT NULL,\n `league` text NOT NULL,\n PRIMARY KEY (`ID`)\n) ENGINE=MyISAM AUTO_INCREMENT=16385 DEFAULT CHARSET=latin2
tomeksobczak
dodaj index na teamID
bogdanofnascie
tzn. ? co masz na mysli ? smile.gif
bogdanofnascie
Indeksy są tworzone w celu przyspieszenia operacji:
  • dostępu do danych w posortowanych według kolumn indeksowanych
  • wyszukiwania wierszy, zawierających dane z indeksowanych kolumn.
Należy jednak zwrócić uwagę, że indeks spowalnia wstawianie, usuwanie i zmiany wartości w indeksowanych kolumnach, ponieważ jego zawartość musi ulec zmianie w momencie zmiany zawartości tabeli.


nie wiem tym samym co zyskam wstawiając taki indeks

Blodo
Cytat
Indeksy są tworzone w celu przyspieszenia operacji:
dostępu do danych w posortowanych według kolumn indeksowanych

UPDATE musi najpierw znalezc wiersz ktory ma zmienic. Jak twoja tabela ma kupe wierszy, to wyszukiwanie bedzie zajmowac wiecej czasu niz samo wstawianie. Dodanie indexu przyspiesza wyszukiwanie, wiec i rowniez cale zapytanie. Tak na dobra sprawe to spowolnienie widac tylko na tabelach ktore maja tak malo wierszy, ze i tak sie nie musisz indeksami przejmowac.

Czytanie ze zrozumieniem pomaga. smile.gif
bogdanofnascie
dzięki wielkie chłopaki biggrin.gif ale to teraz zapierd*** ;D
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.