Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [mysql]Order by zajmuje wieczność
Forum PHP.pl > Forum > Bazy danych > MySQL
someone.cool
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
erix
A jakie indeksy Waść posiada?
someone.cool
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?
erix
Może lepiej pokaż pełne
  1. SHOW CREATE TABLE
...
mad/
Polecałbym stworzyć więcej dodatkowych pól w tabeli, jeśli to możliwie i pozbyć się left join, bardzo wolna rzecz.
someone.cool
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
maly_swd
a co pokazuje magiczne explain?
someone.cool
nie za bardzo umiem odczytać co tam jest napisane.
phpion
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...
someone.cool
Cytat(phpion @ 19.11.2009, 15:08:03 ) *
Wyobraź sobie, że nam jest jeszcze ciężej...

aha.

a na co mam zwrócić uwagę ?
phpion
Cytat(someone.cool @ 19.11.2009, 16:23:28 ) *
aha.

No.

http://dev.mysql.com/doc/refman/5.0/en/using-explain.html
Ges
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
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.