Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySql] Nie szuka po kolumnach indeksowanych.
Forum PHP.pl > Forum > Bazy danych > MySQL
mariuszg
witam,

MySql Query Browser podczas:

  1. EXPLAIN SELECT marka,model,typ id_dane,stan, rocznik,cena,region,przebieg, data_aktywacji, kategoria, typ_oferty, osobowe_marka.id, rocznik, rocznik FROM ogloszenia_02.dane LEFT JOIN ogloszenia_02.osobowe_marka ON osobowe_marka.id = dane.id_marka
  2. LEFT JOIN ogloszenia_02.osobowe_model ON osobowe_model.id = dane.id_model
  3. LEFT JOIN ogloszenia_02.osobowe_typ ON osobowe_typ.id = dane.id_typ
  4.  
  5. WHERE rocznik > 2005 AND rocznik < 2009 AND stan = 1 AND kategoria = 1 AND typ_oferty = 1
  6.  
  7. ORDER BY cena DESC


pokazuje że:

possible_keys - stan,kategoria,typ_oferty,rocznik
key - stan


czas wyszukiwania około 2,5 s

czasami szuka po indeksie rocznik i wtedy wyszukiwanie trwa 0,02 s

Dlaczego zawsze nie wyszukuje po roczniku ?

tabela:

  1. CREATE TABLE `dane` (
  2. `id_dane` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  3. `id_uzytkownik` int(10) UNSIGNED NOT NULL,
  4. `fp` tinyint(1) UNSIGNED DEFAULT NULL,
  5. `kategoria` tinyint(1) UNSIGNED DEFAULT NULL,
  6. `typ_oferty` tinyint(1) UNSIGNED DEFAULT NULL,
  7. `data_dodania` datetime DEFAULT NULL,
  8. `data_aktywacji` datetime DEFAULT NULL,
  9. `stan` tinyint(1) UNSIGNED DEFAULT NULL,
  10. `wyroznienie` tinyint(1) UNSIGNED DEFAULT NULL,
  11. `fotografie` tinyint(1) UNSIGNED DEFAULT NULL,
  12. `id_marka` int(10) UNSIGNED DEFAULT NULL,
  13. `id_model` int(10) UNSIGNED DEFAULT NULL,
  14. `id_typ` int(10) UNSIGNED DEFAULT NULL,
  15. `rocznik` smallint(11) UNSIGNED DEFAULT NULL,
  16. `miesiac` varchar(3) DEFAULT NULL,
  17. `przebieg` int(10) UNSIGNED DEFAULT NULL,
  18. `cena` int(10) UNSIGNED DEFAULT NULL,
  19. `region` char(2) DEFAULT NULL,
  20. `typ_silnika` char(10) DEFAULT NULL,
  21. `silnik` varchar(2) DEFAULT NULL,
  22. `pojemnosc` char(5) DEFAULT NULL,
  23. `moc` char(5) DEFAULT NULL,
  24. `typ_nadwozia` char(2) DEFAULT NULL,
  25. `drzwi` char(2) DEFAULT NULL,
  26. `kolor` varchar(20) DEFAULT NULL,
  27. `o_1` tinyint(1) UNSIGNED DEFAULT NULL,
  28. `o_2` tinyint(1) UNSIGNED DEFAULT NULL,
  29. `o_3` tinyint(1) UNSIGNED DEFAULT NULL,
  30. `o_4` tinyint(1) UNSIGNED DEFAULT NULL,
  31. `o_5` tinyint(1) UNSIGNED DEFAULT NULL,
  32. `o_6` tinyint(1) UNSIGNED DEFAULT NULL,
  33. `o_7` tinyint(1) UNSIGNED DEFAULT NULL,
  34. `o_8` tinyint(1) UNSIGNED DEFAULT NULL,
  35. `o_9` tinyint(1) UNSIGNED DEFAULT NULL,
  36. `o_10` tinyint(1) UNSIGNED DEFAULT NULL,
  37. `o_11` tinyint(1) UNSIGNED DEFAULT NULL,
  38. `o_12` tinyint(1) UNSIGNED DEFAULT NULL,
  39. `o_13` tinyint(1) UNSIGNED DEFAULT NULL,
  40. `o_14` tinyint(1) UNSIGNED DEFAULT NULL,
  41. `o_15` tinyint(1) UNSIGNED DEFAULT NULL,
  42. `w_1` tinyint(1) UNSIGNED DEFAULT NULL,
  43. `w_2` tinyint(1) UNSIGNED DEFAULT NULL,
  44. `w_3` tinyint(1) UNSIGNED DEFAULT NULL,
  45. `w_4` tinyint(1) UNSIGNED DEFAULT NULL,
  46. `w_5` tinyint(1) UNSIGNED DEFAULT NULL,
  47. `w_6` tinyint(1) UNSIGNED DEFAULT NULL,
  48. `w_7` tinyint(1) UNSIGNED DEFAULT NULL,
  49. `w_8` tinyint(1) UNSIGNED DEFAULT NULL,
  50. `w_9` tinyint(1) UNSIGNED DEFAULT NULL,
  51. `w_10` tinyint(1) UNSIGNED DEFAULT NULL,
  52. `w_11` tinyint(1) UNSIGNED DEFAULT NULL,
  53. `w_12` tinyint(1) UNSIGNED DEFAULT NULL,
  54. `w_13` tinyint(1) UNSIGNED DEFAULT NULL,
  55. `w_14` tinyint(1) UNSIGNED DEFAULT NULL,
  56. `w_15` tinyint(1) UNSIGNED DEFAULT NULL,
  57. `w_16` tinyint(1) UNSIGNED DEFAULT NULL,
  58. `w_17` tinyint(1) UNSIGNED DEFAULT NULL,
  59. `w_18` tinyint(1) UNSIGNED DEFAULT NULL,
  60. `w_19` tinyint(1) UNSIGNED DEFAULT NULL,
  61. `w_20` tinyint(1) UNSIGNED DEFAULT NULL,
  62. `w_21` tinyint(1) UNSIGNED DEFAULT NULL,
  63. `w_22` tinyint(1) UNSIGNED DEFAULT NULL,
  64. `w_23` tinyint(1) UNSIGNED DEFAULT NULL,
  65. `w_24` tinyint(1) UNSIGNED DEFAULT NULL,
  66. `w_25` tinyint(1) UNSIGNED DEFAULT NULL,
  67. `w_26` tinyint(1) UNSIGNED DEFAULT NULL,
  68. `w_27` tinyint(1) UNSIGNED DEFAULT NULL,
  69. `w_28` tinyint(1) UNSIGNED DEFAULT NULL,
  70. `w_29` tinyint(1) UNSIGNED DEFAULT NULL,
  71. `w_30` tinyint(1) UNSIGNED DEFAULT NULL,
  72. `w_31` tinyint(1) UNSIGNED DEFAULT NULL,
  73. `w_32` tinyint(1) UNSIGNED DEFAULT NULL,
  74. `w_33` tinyint(1) UNSIGNED DEFAULT NULL,
  75. `w_34` tinyint(1) UNSIGNED DEFAULT NULL,
  76. `w_35` tinyint(1) UNSIGNED DEFAULT NULL,
  77. `w_36` tinyint(1) UNSIGNED DEFAULT NULL,
  78. `w_37` tinyint(1) UNSIGNED DEFAULT NULL,
  79. `w_38` tinyint(1) UNSIGNED DEFAULT NULL,
  80. `w_39` tinyint(1) UNSIGNED DEFAULT NULL,
  81. `w_40` tinyint(1) UNSIGNED DEFAULT NULL,
  82. `w_41` tinyint(1) UNSIGNED DEFAULT NULL,
  83. `w_42` tinyint(1) UNSIGNED DEFAULT NULL,
  84. `sciezka` varchar(50) DEFAULT NULL,
  85. `foto_a` varchar(50) DEFAULT NULL,
  86. `foto_b` varchar(50) DEFAULT NULL,
  87. `foto_c` varchar(50) DEFAULT NULL,
  88. `foto_d` varchar(50) DEFAULT NULL,
  89. `foto_e` varchar(50) DEFAULT NULL,
  90. `foto_f` varchar(50) DEFAULT NULL,
  91. `foto_g` varchar(50) DEFAULT NULL,
  92. `foto_h` varchar(50) DEFAULT NULL,
  93. `foto_i` varchar(50) DEFAULT NULL,
  94. PRIMARY KEY (`id_dane`),
  95. KEY `FK_id_marka` (`id_marka`),
  96. KEY `stan` (`stan`),
  97. KEY `kategoria` (`kategoria`),
  98. KEY `typ_oferty` (`typ_oferty`),
  99. KEY `data_aktywacji` (`data_aktywacji`),
  100. KEY `rocznik` (`rocznik`)
  101. ) ENGINE=InnoDB DEFAULT CHARSET=latin2 ROW_FORMAT=DYNAMIC AUTO_INCREMENT=100006 ;
nevt
co masz na myśli CZASAMI questionmark.gif TO SAMO zapytanie raz się wykonuje 0,02 sek. a innym razem 2,5 sek questionmark.gif czy to są DWA RÓŻNE ZAPYTANIA questionmark.gif

pokaż je (warianty zapytań) - wtedy coś można wnioskować...

a przy okazji - pola:
o_1 - o_15,
w_1 - w_42,
foto_a - foto_i

bez względu na przeznaczenie są złym pomysłem i powinny wylądować w oddzielnych tabelach
mariusz g
o_1 - o_15, - tylko 0 lub 1 - np jeśli ma ABS to 1, czyli lepiej w osobnej tabeli
w_1 - w_42, - taki jak pierwszy tylko inne opcje
foto_a - foto_i - nazwa pliku fotek


jeśli zapytanie jest takie
  1. WHERE rocznik > 2005 AND rocznik < 2009


to używa indeksu rocznik

jak to zrobić żeby używał odpowiednich indeksów ?
gino
Jak to stwierdzasz, że czasem wyszukuje po indexie a czasem nie questionmark.gif Czas wykonania zapytania jest uzależniony od wielu czynników nie tylko od indexów, ale także obciążenia bazy w momencie zapytania czy wydajności łącza. Jeśli index po kolumnie którą szukasz jest zdefiniowany to wyszukuje po indexie. Im bardziej założone zapytanie, duża ilość rekordów oraz w nielogicznej kolejności skonstruowane tym odpowiedz bazy trwa dłużej. Sortowanie odbywa sie po kolei jak w zapytaniu, ważne jest więc dokładne zaprojektowanie bazy danych.
gino
mariusz g
explain mi pokazuje

possible_keys - stan,kategoria,typ_oferty,rocznik -- po jakich może
key - stan - po jakich szuka
gino
ok, spotkałem kiedyś osąd, że MySQL nie zawsze wybiera najlepszą możliwość w danym zapytaniu w kwestii użycia indexów. Taki urok bazy.

gino


edit:

posible_keys i key pozwala nam dowiedzieć się z jakich innych indeksów możemy próbować korzystać a jak zrobi MySQL to już inna sprawa, j.w.
nevt
jeżeli masz dużo zapytań z użyciem kilku pól ( u ciebie: rocznik, typ_oferty, kategoria, stan) a nie potrzebujesz super wydajności przy INSERT i UPDATE to rozważyłbym założenie dodatkowego indeksu wielopolowego (na te wszystkie pola po których szukasz) - to powinno ożywić twoje SELECT...
mariusz g
Czy mogę zrobić indeks wielopolowy zawierający np 15 pozycji, bo po tych pozycja będzie wyszukiwanie, czasami po dwóch a czasami po 3,4,5,6,7,8 itd.

użytkownik będzie miał formularz na stronie i on wybiera to co potrzebuje, więc ja to objąć w sensowną całość ?
jeśli zawsze w wyszukiwani były by 4 pola to ok, ale to się zmienia

np:

marka,model,typ id_dane,stan, rocznik,cena,region,przebieg, data_aktywacji, kategoria, typ_oferty, osobowe_marka.id, rocznik, rocznik

czy to nie pogorszy wyszukiwania ?
nevt
na pewno powiększy mocno bazę, na pewno spowolni insert i update - a czy przyspieszy select ? spróbuj - załóż indeks, przetestuj wydajność - my nie mamy tej bazy ani tego formularza - jak mamy ci to sprawdzić... questionmark.gif

wg mnie problem może być głębszy - niewydajna struktura bazy przy dużej ilości danych i skomplikowanych zapytaniach... wtedy żadne indeksy nie pomogą jeżeli nie zmienisz schematu bazy...
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.