Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [mysql]Order by zajmuje wieczność
someone.cool
post 30.10.2009, 22:34:36
Post #1





Grupa: Zarejestrowani
Postów: 50
Pomógł: 1
Dołączył: 31.01.2009

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


Witam, jest takie zapytanie które trwa 15 sek (wariant z "ORDER BY tab1.id"), jak zamienię zapytanie aby sortowało się wg. tab2.id to trwa ono 6 sek (wariant z "ORDER BY tab2.id").

Po ustawiałem wszystkie indeksy: tab2 (id,type,del,version) tab1(id).

Niestety muszę korzystać z "ORDER BY tab1.id" Choć tab1.id=tab2.id.

  1. SELECT *
  2. FROM tab1
  3. INNER JOIN tab2
  4. ON tab2.id = tab1.id
  5. LEFT JOIN tab4
  6. ON tab2.sid = tab4.bid
  7. LEFT JOIN tab3
  8. ON tab3.aid = tab1.TO
  9. LEFT JOIN tab5
  10. ON tab5.cid = tab1.cid
  11. WHERE
  12. tab2.type = 'typ'
  13. AND tab2.del = 0
  14. AND tab2.version = 3
  15. ORDER BY tab1.id


Ten post edytował someone.cool 30.10.2009, 22:39:31
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 11)
erix
post 2.11.2009, 12:50:07
Post #2





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




A jakie indeksy Waść posiada?


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
someone.cool
post 2.11.2009, 13:13:07
Post #3





Grupa: Zarejestrowani
Postów: 50
Pomógł: 1
Dołączył: 31.01.2009

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


ustawiam indeksy zawsze tam gdzie używam tabeli w WHERE...

Po ustawiałem indeksy: tab2 (id,type,del,version) tab1(id)
.


edit: może pytaniem powinno być - czy index na tabeli `tab2` ma być jeden, czy 3 osobne?

Ten post edytował someone.cool 2.11.2009, 13:14:55
Go to the top of the page
+Quote Post
erix
post 2.11.2009, 23:06:52
Post #4





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Może lepiej pokaż pełne
  1. SHOW CREATE TABLE
...


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
mad/
post 13.11.2009, 23:58:50
Post #5





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 7.10.2009

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


Polecałbym stworzyć więcej dodatkowych pól w tabeli, jeśli to możliwie i pozbyć się left join, bardzo wolna rzecz.
Go to the top of the page
+Quote Post
someone.cool
post 19.11.2009, 11:18:29
Post #6





Grupa: Zarejestrowani
Postów: 50
Pomógł: 1
Dołączył: 31.01.2009

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


Wracamy do tematu. Tab1 jest tu najważniejsza - jest to rejestr rekordów (np. kolumna13 - czy usunięty?, kolumna_5 - typ dokumentu, kolumna_11 - firma).
Tab2 to już właściwa tabela dokumentu.

tab1 ma 150 000 rekordów. Z order by potrafi sie wykonywać czasami AŻ 2,5 minuty, a bez tego 0,015 sek smile.gif

  1. SELECT *
  2. FROM tab2
  3. INNER JOIN tab1
  4. ON tab1.id = tab2.id
  5. LEFT JOIN tab4
  6. ON tab1.sid = tab4.bid
  7. LEFT JOIN tab3
  8. ON tab3.aid = tab2.TO
  9. LEFT JOIN tab5
  10. ON tab5.cid = tab2.cid
  11. WHERE
  12. tab1.kolumna_5 = 'typ'
  13. AND tab1.kolumna_13 = 0
  14. AND tab1.kolumna_11 = 3
  15. ORDER BY tab2.id



  1. CREATE TABLE `tab1` (
  2. `kolumna_1` int(19) NOT NULL AUTO_INCREMENT,
  3. `kolumna_2` int(19) NOT NULL DEFAULT '0',
  4. `kolumna_3` int(19) NOT NULL DEFAULT '0',
  5. `kolumna_4` int(19) NOT NULL DEFAULT '0',
  6. `kolumna_5` varchar(30) COLLATE utf8_polish_ci NOT NULL,
  7. `kolumna_6` text COLLATE utf8_polish_ci,
  8. `kolumna_7` datetime DEFAULT NULL,
  9. `kolumna_8` datetime DEFAULT NULL,
  10. `kolumna_9` datetime DEFAULT NULL,
  11. `kolumna_10` varchar(50) COLLATE utf8_polish_ci DEFAULT NULL,
  12. `kolumna_11` int(19) NOT NULL DEFAULT '0',
  13. `kolumna_12` int(1) DEFAULT '1',
  14. `kolumna_13` int(1) NOT NULL DEFAULT '0',
  15. PRIMARY KEY (`kolumna_1`),
  16. KEY `kolumna_2_idx` (`kolumna_2`),
  17. KEY `kolumna_3_idx` (`kolumna_13`,`kolumna_3`),
  18. KEY `kolumna_13` (`kolumna_3`,`kolumna_13`),
  19. KEY `kolumna_5` (`kolumna_5`,`kolumna_13`),
  20. KEY `kolumna_11` (`kolumna_5`,`kolumna_11`,`kolumna_13`)
  21. ) ENGINE=InnoDB AUTO_INCREMENT=149352 DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci


  1. CREATE TABLE `tab2` (
  2. `column_id` int(19) NOT NULL AUTO_INCREMENT,
  3. `column_2` varchar(255) COLLATE utf8_polish_ci DEFAULT '',
  4. `column3` date DEFAULT NULL,
  5. `column4` decimal(6,0) DEFAULT NULL,
  6. `column5` decimal(6,0) DEFAULT NULL,
  7. `column6` int(19) NOT NULL DEFAULT '0',
  8. `column7` varchar(255) COLLATE utf8_polish_ci DEFAULT '',
  9. `column8` varchar(255) COLLATE utf8_polish_ci DEFAULT '',
  10. `column9` varchar(255) COLLATE utf8_polish_ci DEFAULT '',
  11. `column10` varchar(255) COLLATE utf8_polish_ci DEFAULT '',
  12. `column11` varchar(255) COLLATE utf8_polish_ci DEFAULT '',
  13. `column12` varchar(255) COLLATE utf8_polish_ci DEFAULT '',
  14. `column13` varchar(255) COLLATE utf8_polish_ci DEFAULT '',
  15. `column14` varchar(255) COLLATE utf8_polish_ci DEFAULT '',
  16. `column15` varchar(255) COLLATE utf8_polish_ci DEFAULT NULL,
  17. `column16` varchar(255) COLLATE utf8_polish_ci DEFAULT '',
  18. `column17` decimal(6,0) DEFAULT NULL,
  19. `column18` decimal(6,0) DEFAULT NULL,
  20. `column19` varchar(255) COLLATE utf8_polish_ci DEFAULT NULL,
  21. `column20` varchar(255) COLLATE utf8_polish_ci DEFAULT '',
  22. `column21` decimal(25,2) DEFAULT NULL,
  23. `column22` decimal(25,2) DEFAULT NULL,
  24. `column23` decimal(25,2) DEFAULT NULL,
  25. `column24` decimal(25,2) DEFAULT NULL,
  26. `column25` decimal(25,2) DEFAULT NULL,
  27. `column26` decimal(25,2) DEFAULT NULL,
  28. `column27` decimal(25,2) DEFAULT NULL,
  29. `column28` decimal(25,2) DEFAULT NULL,
  30. `column29` varchar(255) COLLATE utf8_polish_ci DEFAULT '',
  31. `column31` decimal(10,0) DEFAULT NULL,
  32. `column32` varchar(255) COLLATE utf8_polish_ci DEFAULT '',
  33. `column33` varchar(255) COLLATE utf8_polish_ci DEFAULT '',
  34. `column34` date DEFAULT NULL,
  35. `column35` varchar(255) COLLATE utf8_polish_ci DEFAULT '',
  36. `column36` int(19) DEFAULT NULL,
  37. `column37` varchar(19) COLLATE utf8_polish_ci DEFAULT NULL,
  38. `column38` date DEFAULT NULL,
  39. `column39` decimal(6,0) DEFAULT NULL,
  40. `column40` varchar(255) COLLATE utf8_polish_ci DEFAULT '',
  41. `column41` varchar(255) COLLATE utf8_polish_ci DEFAULT '',
  42. `column42` varchar(255) COLLATE utf8_polish_ci DEFAULT NULL,
  43. `column43` decimal(10,2) DEFAULT NULL,
  44. `column44` decimal(10,2) DEFAULT NULL,
  45. `column45` varchar(255) COLLATE utf8_polish_ci DEFAULT '',
  46. `column46` varchar(255) COLLATE utf8_polish_ci DEFAULT '',
  47. `column47` decimal(10,0) DEFAULT NULL,
  48. `column48` varchar(255) COLLATE utf8_polish_ci DEFAULT '',
  49. `column49` varchar(255) COLLATE utf8_polish_ci DEFAULT '',
  50. `column50` date DEFAULT NULL,
  51. `column51` decimal(10,0) DEFAULT NULL,
  52. `column52` decimal(10,0) DEFAULT NULL,
  53. `column53` decimal(26,0) DEFAULT NULL,
  54. `column54` decimal(26,0) DEFAULT NULL,
  55. `column55` varchar(255) COLLATE utf8_polish_ci DEFAULT '',
  56. `column56` varchar(255) COLLATE utf8_polish_ci DEFAULT '',
  57. `column57` varchar(3) COLLATE utf8_polish_ci DEFAULT '0',
  58. `column58` varchar(3) COLLATE utf8_polish_ci DEFAULT '0',
  59. `column59` varchar(255) COLLATE utf8_polish_ci DEFAULT '',
  60. `column60` varchar(255) COLLATE utf8_polish_ci DEFAULT NULL,
  61. `column61` varchar(255) COLLATE utf8_polish_ci DEFAULT NULL,
  62. `column62` varchar(255) COLLATE utf8_polish_ci DEFAULT NULL,
  63. PRIMARY KEY (`column_id`),
  64. KEY `column_2` (`column_2`)
  65. ) ENGINE=InnoDB AUTO_INCREMENT=149225 DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci


Ten post edytował someone.cool 19.11.2009, 12:08:20
Go to the top of the page
+Quote Post
maly_swd
post 19.11.2009, 13:53:45
Post #7





Grupa: Zarejestrowani
Postów: 744
Pomógł: 118
Dołączył: 14.02.2009
Skąd: poziome

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


a co pokazuje magiczne explain?


--------------------
śmieszne obrazki
Kryzys: Ser jem spleśniały, wino piję stare i samochód mam bez dachu..
Go to the top of the page
+Quote Post
someone.cool
post 19.11.2009, 15:06:52
Post #8





Grupa: Zarejestrowani
Postów: 50
Pomógł: 1
Dołączył: 31.01.2009

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


nie za bardzo umiem odczytać co tam jest napisane.
Go to the top of the page
+Quote Post
phpion
post 19.11.2009, 15:08:03
Post #9





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Cytat(someone.cool @ 19.11.2009, 16:06:52 ) *
nie za bardzo umiem odczytać co tam jest napisane.

Wyobraź sobie, że nam jest jeszcze ciężej...
Go to the top of the page
+Quote Post
someone.cool
post 19.11.2009, 15:23:28
Post #10





Grupa: Zarejestrowani
Postów: 50
Pomógł: 1
Dołączył: 31.01.2009

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


Cytat(phpion @ 19.11.2009, 15:08:03 ) *
Wyobraź sobie, że nam jest jeszcze ciężej...

aha.

a na co mam zwrócić uwagę ?
Go to the top of the page
+Quote Post
phpion
post 19.11.2009, 15:34:00
Post #11





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Cytat(someone.cool @ 19.11.2009, 16:23:28 ) *
aha.

No.

http://dev.mysql.com/doc/refman/5.0/en/using-explain.html
Go to the top of the page
+Quote Post
Ges
post 20.11.2009, 11:56:57
Post #12





Grupa: Zarejestrowani
Postów: 61
Pomógł: 9
Dołączył: 22.02.2008

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


To ja ze swojej strony zapytam się z jakiego ENGINE korzystasz w przypadku tych tabel ? I czy wszystkie te tabele które JOINujesz mają ten samy typ.

Dodatkowo mógłbyś pokazać na których kolumnach masz indexy pozakładane. Zbyt duża ilość indexów też może sprawiać problemy.
Dorzuć to co zwraca EXPLAIN + dla każdej
  1. SHOW TABLE STATUS LIKE 'nazwa' \G
to może pomożemy konkretniej.

Teraz to są zgadywanki i strzały w ciemno
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 01:08