Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Różny czas wykonywania zapytań na tej samej tabeli, Dwie takie same tabele 160tyś i 260tyś - znacząco różny czas wykonywan
Radek_1
post
Post #1





Grupa: Zarejestrowani
Postów: 54
Pomógł: 0
Dołączył: 9.09.2003
Skąd: Bełchatów

Ostrzeżenie: (0%)
-----


Mam dwie takie same tabelki w różnych bazach (ale ten sam serwer):
  1. CREATE TABLE IF NOT EXISTS `baza` (
  2. `UID` int(11) NOT NULL AUTO_INCREMENT,
  3. `name` varchar(30) CHARACTER SET latin1 NOT NULL,
  4. `lvl` int(3) DEFAULT NULL,
  5. `voc` varchar(30) CHARACTER SET latin1 DEFAULT NULL,
  6. `guild` varchar(30) DEFAULT NULL,
  7. `sex` varchar(7) DEFAULT NULL,
  8. `world` varchar(20) NOT NULL,
  9. `joined` int(10) NOT NULL,
  10. `lastlogin` int(10) DEFAULT NULL,
  11. `created_acc` int(10) DEFAULT NULL,
  12. `city` varchar(30) DEFAULT NULL,
  13. PRIMARY KEY (`UID`),
  14. KEY `name` (`name`),
  15. KEY `guild` (`guild`)
  16. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC AUTO_INCREMENT=185322 ;



W jednej jest 165tyś rekordów (23mb), w drugiej 270 tyś (33mb). Wykonuje paczki po 4 update na każdej bazie. Zapytanko wygląda mniej więcej tak:

  1. mysql_query("UPDATE baza SET lvl=".$record[level].", voc='".$record[vocation]."', guild='".$record[guild]."', sex='".$record[sex]."', lastlogin=".$record[lastlogin].", created_acc='".$record[created]."', city='".$record[residence]."' WHERE UID=".$record[uid]);


Najpierw baza z 165tyś rekordów i czasy wykonania 4 update w cyklu:
0.0023970603942871 sec
0.0020239353179932 sec
0.002047061920166 sec
0.0020139217376709 sec
0.0020439624786377 sec
0.0020511150360107 sec
0.0022640228271484 sec
0.0016040802001953 sec
0.0011930465698242 sec
0.0021450519561768 sec
0.0013589859008789 sec
0.0019218921661377 sec

Suma czasu dla 50 zapytań update: 4.3591480255127 sec


To samo na większej bazie (270tyś), też po 4 zapytania w cyklu:
0.012955188751221 sec
0.0023949146270752 sec
1.7737629413605 sec
0.16048979759216 sec
0.24561595916748 sec
0.15996599197388 sec
0.22124600410461 sec
0.26379299163818 sec
0.2989809513092 sec
0.18192505836487 sec
0.0041689872741699 sec
0.027604103088379 sec
0.53889012336731 sec

Suma dla 50 zapytań: 8.4705171585083 sec


Czym mogą być spowodowane tak duże rozbieżności w czasue wykonania tak prostego update? Różnica w ilości rekordów nie jest duża, zaledwie 100tyś. Co można zrobić aby poprawić efektywność zapytań?

Ten post edytował Radek_1 12.01.2013, 01:59:14
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
alegorn
post
Post #2





Grupa: Zarejestrowani
Postów: 341
Pomógł: 40
Dołączył: 23.06.2009

Ostrzeżenie: (0%)
-----


przejdz na innodb, myisam przy update zaklada lock na cala tabele.

sprawdzanie na roznych serwerach jest bez sensu. wyniki nie beda miarodajne, nawet jesli dostaniesz dokladnie takie same zasoby - to obciazenie maszyny moze byc inne, a wtedy wyniki wyjda ci diametralnie rozne.

dlaczego te pola :
  1. `name` varchar(30) CHARACTER SET latin1 NOT NULL,
  2. `voc` varchar(30) CHARACTER SET latin1 DEFAULT NULL,

sa w latin1 skoro pozniej definiujesz tabele jako utf?? jaki w tym sens?

skoro danych masz mniej niz 1kk to po co zdefiniowales tak wielki index (IMG:style_emoticons/default/questionmark.gif) jak dla mnie by wystarczyl smalint(6)

wykonaj
  1. SELECT * FROM baza PROCEDURE ANALYSE()


i zastanow sie, czy zasugerowane zmiany nie mają sensu.

pozdrawiam,
Jacek.

edit: drobne korekty

Ten post edytował alegorn 17.01.2013, 11:47:25
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 17.02.2026 - 05:49