![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 16 Pomógł: 0 Dołączył: 12.08.2005 Ostrzeżenie: (0%) ![]() ![]() |
Witam.
Mam w tabeli ponad 120 000 rekordów. 4 kolumny wykorzystywane w skrypcie. Wykonanie jednego zapytania SELECT * FROM wplaty WHERE id_osoby LIKE '5' trwa okolo 9 sekund. Zwracane jest 10 rekordów, bo tyle do tej osoby należy. Czy da się w jakiś sposób zmniejszyć liczbę sekund, żeby generowanie 10 wierszy nie zajmowało tyle czasu? Typ tabeli MyISAM, wersja MySQL 5.3.0, sprzęt klasy średniej: 768 MB ramu, procek 1,4 GHz, Windows XP Proffesional. Dzięki z góry Pozdrawiam |
|
|
![]()
Post
#2
|
|
![]() Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
WHERE id_osoby LIKE '5'
ałć.... ![]() WHERE id_osoby = 5 Poczytaj w manualu co do czego sluzy i do tego uzywaj ps: zakladam tez ze masz index na id_osoby zalozony? -------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#3
|
|
![]() Grupa: Moderatorzy Postów: 8 989 Pomógł: 1550 Dołączył: 8.08.2008 Skąd: Słupsk/Gdańsk ![]() |
Założyłes klucz na id_osoby?
Jeżeli nie to załóż. I pobieraj raczej te dane, ktore potrzebujesz -------------------- |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 855 Pomógł: 145 Dołączył: 17.07.2008 Skąd: High Memory Area Ostrzeżenie: (0%) ![]() ![]() |
Skąd masz MySQL 5.3.0?
|
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 16 Pomógł: 0 Dołączył: 12.08.2005 Ostrzeżenie: (0%) ![]() ![]() |
był indeks tylko na id wplaty. dodalem na id_osoby i juz jest ok. 2 sekundy pobiera
![]() P.S. nie 5.3.0 tylko 5.1.36 pomylilem z PHP ![]() |
|
|
![]()
Post
#6
|
|
![]() Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Cytat 2 sekundy pobiera nadal dlugo. wywaliles tego LIKE jak ci pisalem?
-------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 855 Pomógł: 145 Dołączył: 17.07.2008 Skąd: High Memory Area Ostrzeżenie: (0%) ![]() ![]() |
Tak myślałem ;P
Pokaż co EXPLAIN pokazuje dla tego zapytania http://dev.mysql.com/doc/refman/5.0/en/explain.html |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 16 Pomógł: 0 Dołączył: 12.08.2005 Ostrzeżenie: (0%) ![]() ![]() |
pozmienialem w kodzie LIKE na = i ograniczylem typy danych do potrzebnych dlugosci. bo wszedzie bylo varchar(255) i jest 0,9 sekundy.
a explain pokazuje
|
|
|
![]()
Post
#9
|
|
![]() Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Cytat i ograniczylem typy danych do potrzebnych dlugosci. bo wszedzie bylo varchar(255) id_osoby varchar(50) zrobienie z id_osoby varchar to tez nie najlepszy pomysl. Tu chyba powinien byc INT. Zakladam ze idosoby to liczba a nie tekst ![]() -------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 855 Pomógł: 145 Dołączył: 17.07.2008 Skąd: High Memory Area Ostrzeżenie: (0%) ![]() ![]() |
Chciałem EXPLAIN SELECTa, a nie tabeli... No ale z tego też widać, że jeszcze struktura tabeli pozostawia do życzenia.
Kod Field Type Null Key Default Extra id_wplaty int(11) NO PRI NULL auto_increment id_przydzialu int(11) NO MUL NULL id_osoby int(11) YES MUL NULL id_kursu varchar(50) YES MUL NULL dane_odbiorcy text YES NULL brutto decimal(8,2) NO NULL opis varchar(255) YES NULL vat deciaml(8,2) YES NULL netto decimal(8,2) YES NULL towar varchar(100) YES NULL id_towaru int(11) YES NULL termin date NO NULL data_wystawienia date YES NULL data_sprzedazy date YES NULL numer_fv varchar(150) YES NULL osoba varchar(150) YES NULL user_add_time datetime YES NULL oddzial varchar(50) YES NULL extra_info text YES NULL pkwiu char(11) YES NULL platnosc varchar(3) YES NULL korekta_nr varchar(255) YES NULL korekta_kwota varchar(255) YES NULL korekta_osoba varchar(255) YES NULL korekta_data varchar(255) YES NULL korekta_user_add varchar(255) YES NULL okres varchar(50) NO NULL kasa varchar(10) YES NULL Kilka sugestii zmian Ten post edytował Mchl 27.04.2010, 12:31:46 |
|
|
![]()
Post
#11
|
|
![]() Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
Chcesz kolejne sugestie? Nie używaj w kolumnie NULL. Ustawiaj NOT NULL, gdyż to rozwiązanie szybsze. tam gdzie tylko liczby masz używaj INT. Jeśli dane są w jakiś sposób możliwe do podziału - zastosuj kilka tabel mniejszych, oddzielając w szczególności te, które mają częsty zapis/edycję. Pola, po których łączysz te tabelę z innymi ustaw jako indeks. To samo z tymi, których używasz w WHERE czy ORDER BY. Staraj unikać konstrukcji SELECT * jeśli nie pobierasz wszystkich danych z tabeli. Ogólnie rzecz biorąc pooglądaj nieco dział optymalizacji w dokumentacji choćby MySQL bo wiele tam ciekawych wskazówek.
-------------------- Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
|
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 855 Pomógł: 145 Dołączył: 17.07.2008 Skąd: High Memory Area Ostrzeżenie: (0%) ![]() ![]() |
Poza tym wydaje się, że ta tabela zasługuje na normalizację.
|
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 4 Pomógł: 0 Dołączył: 1.05.2010 Ostrzeżenie: (0%) ![]() ![]() |
Conajmniej 3 różne tabele powinny być
np. faktura pozycje_na_fakturze korekty |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 13.06.2025 - 01:43 |