Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: ORDER BY po kolumnie z indeksem długo działa
Forum PHP.pl > Forum > Bazy danych > MySQL
TomASS
Mam zapytanie

  1. [/sql]
  2. SELECT *
  3. FROM m_transporty_miejsca AS TM
  4. LEFT JOIN m_transporty AS T ON (T.ID=TM.ID_transport)
  5. LEFT JOIN m_magazyny AS M ON (M.ID=T.ID_magazyn)
  6. LEFT JOIN m_przewoznicy AS Pr ON (Pr.ID=T.ID_przewoznik)
  7. WHERE Miejsce='akt' AND DATE(T.DateRealizacji) >= '2016-11-26' AND T.RodzajCiezarowki='plandeka24' AND DATE(T.DateRealizacji) <= '2016-11-28' AND 1 ORDER BY `Status` ASC LIMIT 0, 40
  8. [sql]


Na kolumnie Status jest indeks. Status to CHAR(10).

Takie zapytanie wykonuje się 78sekund
Po usunięciu ORDER BY `Status` czas spada do 2-3sekund.

Co robić? sad.gif
Indeks jest
Zmieniałem bazę danych z MySQL 5.0 na 5.6 i tak się porobiło :/
Explain pokazuje:
nospor
Poniewasz masz tam jeszcze warunki.

Musisz zalozyc indexy tez na warunki.
Swoja droga masz zdziebko zwalone pola. To nie powinny byc zadne stringi a INTy ewentualnie ENUM jak chcesz dzialac na nazwach. I nie mowie tu tylko o kolumnie status.
TomASS
Dzięki,

tylko:
1. na MySQL 5.0 nie było problemów :/
2. Indeks nie może być za długi a liczba pól w warunkach jest spora
3. Dlaczego nie mogą być stringi? Mówisz o Miejsce i RodzajCiezarowki ?
nospor
ps:
I miejze litosc na przyszlosc i nie mieszaj jezykow
DateRealizacji
no jak to wyglada? wink.gif

Cytat
Dlaczego nie mogą być stringi? Mówisz o Miejsce i RodzajCiezarowki ?

Tak. Zakladam ze to sa jakies stale nazwy. Dla bazy latwiej jest zaindeksowac TINYINT/ENUM ktore ma raptem 10 roznych wartosci niz string ktory moze teoretycznie byc czym popadnie.
TomASS
Cytat(nospor @ 24.11.2016, 18:07:47 ) *
ps:
I miejze litosc na przyszlosc i nie miesaj jezykow
DateRealizacji
no jak to wyglada? wink.gif


A skąd wiesz, że to ja? smile.gif

Cytat(nospor @ 24.11.2016, 18:07:47 ) *
Tak. Zakladam ze to sa jakies stale nazwy. Dla bazy latwiej jest zaindeksowac INT/ENUM ktore ma raptem 10 roznych wartosci niz string ktory moze teoretycznie byc czym popadnie.

Jak pole "Miejsce" typu enum (3 wartości) to działało znacznie dłużej :/

nospor
Cytat
Jak pole "Miejsce" typu enum (3 wartości) to działało znacznie dłużej
Strasznie szybko to zmieniles. Az mi sie niechce wiezyc wink.gif

Cytat
A skąd wiesz, że to ja?
Coz.... moja wina wink.gif
TomASS
Cytat(nospor @ 24.11.2016, 18:10:15 ) *
Strasznie szybko to zmieniles. Az mi sie niechce wiezyc wink.gif

Było wcześniej i kilka miesięcy temu zmieniłem z enum na char
mmmmmmm
Wywal LEFT JOIN przy aliasie T (m_transporty).
Skoro później wymieniasz pola z tej tabeli we WHERE, to LEFT jest bez sensu. No chyba, że masz w warunku T.id IS NULL smile.gif
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.