Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Powolne przeglądanie produktów
Walian
post
Post #1





Grupa: Zarejestrowani
Postów: 124
Pomógł: 1
Dołączył: 13.07.2009

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


Witam,

Pracuję nad pewnym serwisem internetowym (niestety nie wolno mi podawać nazwy ani adresu), który zaczyna już dość mocno zwalniać. W chwili obecnej problem stanowią dwie tabele:
- tabela produktów - MyISAM, ponad 700 tyś rekordów, ponad 180 MB.
- tabela ofert do produktów - MyISAM, ponad 1 125 000 rekordów, ponad 230 MB.

Do rzeczy - problem stanowi już samo przeglądanie produktów.
  1. SELECT
  2. SQL_NO_CACHE
  3. SQL_CALC_FOUND_ROWS
  4. `p`.`produkt_id`,
  5. `p`.`name`,
  6. `p`.`katalog`,
  7. `p`.`pod_katalog`,
  8. `p`.`category_id`,
  9. `o`.`user_id`,
  10. `o`.`cena`,
  11. `o`.`id` AS `id_offer`
  12. FROM
  13. `produkty` `p`
  14. INNER JOIN
  15. `oferty` `o`
  16. ON
  17. `o`.`produkt_id`=`p`.`produkt_id`
  18. LEFT JOIN
  19. `uzytkownicy` `u`
  20. ON
  21. `u`.`user_id`=`o`.`user_id`
  22. WHERE
  23. `u`.`aktywny`=1 ; Tu waskie gardlo...
  24. ; W chwili obecnej wszyscy maja "1", ale TO sie kiedys zmieni...
  25. AND
  26. `p`.`category_id` IN (tutaj 176 numerow (cale drzewko) kategorii)
  27. AND ; Od tego momentu rozne filtry:
  28. `o`.`cena` BETWEEN 1 AND 99999
  29. ORDER BY
  30. `p`.`name` ASC ; Zamiast tego moze sie pojawic sortowanie wg ceny
  31. LIMIT 0,20

Cytat
20 rows in set (9.70 sec)

Bez SQL_CALC_FOUND_ROWS:
Cytat
20 rows in set (6.63 sec)

To samo zapytanie, ale bez wyciągania danych - zamiast tego COUNT(*):
Cytat
20 rows in set (6.71 sec)

Teraz wracając do początku:
Bez "`u`.`aktywny`=1":
Cytat
20 rows in set (1.86 sec)

Bez "`u`.`aktywny`=1" oraz bez "ORDER BY `p`.`name` ASC":
Cytat
20 rows in set (1.16 sec)

Bez "`u`.`aktywny`=1" oraz bez "`o`.`cena` BETWEEN 1 AND 99999" oraz bez "ORDER BY `p`.`name` ASC":
Cytat
20 rows in set (1.07 sec)

Ostatnie zapytanie, ale bez SQL_CALC_FOUND_ROWS:
Cytat
20 rows in set (0.00 sec)


Serwis stoi na serwerze dedykowanym...

Jak przyspieszyć to zapytanie? Nie mogę zrezygnować z tych warunków WHERE, ale może da radę jakoś inaczej zapytanie skonstruować?
Przejście na InnoDB pomoże czy rozwiązania trzeba szukać gdzie indziej?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Walian
post
Post #2





Grupa: Zarejestrowani
Postów: 124
Pomógł: 1
Dołączył: 13.07.2009

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


Ale jak niby taki cache zrobić? Nie widzę tu sensu, skoro najmniejsza zmiana w filtrze, przejście do innej kategorii, czy wyszukiwanie wg jakieś frazy zmienia już postać i ilość wyników. Po stronie serwera też nie ma sensu bo powstanie olbrzymia ilość plików cache. Jeśli do tego uwzględnić fakt, że ciągle są dodawane lub aktualizowane produkty to liczba "kombinacji" jest olbrzymia.

  1. SHOW CREATE TABLE `uzytkownicy`;
  2. CREATE TABLE `uzytkownicy` (
  3. `user_id` int(11) NOT NULL AUTO_INCREMENT,
  4. `aktywny` int(11) NOT NULL DEFAULT '1',
  5. PRIMARY KEY (`user_id`),
  6. FULLTEXT KEY `nazwa_sklepu` (`nazwa_sklepu`),
  7. FULLTEXT KEY `city` (`city`)
  8. ) ENGINE=MyISAM AUTO_INCREMENT=100962 DEFAULT CHARSET=latin2 PACK_KEYS=0
  9. -- Indeks na polu "aktywny" nic nie daje, bo w kazdym rekordzie jest "1", przynajmniej na razie
  10.  
  11. SHOW CREATE TABLE `produkty`;
  12. CREATE TABLE `produkty` (
  13. `produkt_id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  14. `name` varchar(255) NOT NULL,
  15. `category_id` smallint(11) NOT NULL DEFAULT '0',
  16. `katalog` tinyint(4) NOT NULL DEFAULT '0',
  17. `pod_katalog` tinyint(4) NOT NULL DEFAULT '0',
  18. PRIMARY KEY (`produkt_id`),
  19. KEY `products_name` (`active`,`name`),
  20. KEY `category_id` (`category_id`),
  21. FULLTEXT KEY `name` (`name`)
  22. ) ENGINE=MyISAM AUTO_INCREMENT=911612 DEFAULT CHARSET=utf8 PACK_KEYS=0
  23.  
  24. SHOW CREATE TABLE `oferty`;
  25. CREATE TABLE `oferty` (
  26. `id` int(11) NOT NULL AUTO_INCREMENT,
  27. `user_id` mediumint(10) NOT NULL DEFAULT '0',
  28. `cena` double(16,2) NOT NULL DEFAULT '0.00',
  29. `nazwa_prod` varchar(255) NOT NULL,
  30. `offer_id` bigint(24) UNSIGNED NOT NULL,
  31. `produkt_id` int(10) UNSIGNED NOT NULL,
  32. PRIMARY KEY (`id`),
  33. KEY `produkt_id` (`produkt_id`),
  34. KEY `user_id` (`user_id`),
  35. KEY `cena` (`cena`)
  36. ) ENGINE=MyISAM AUTO_INCREMENT=1357689 DEFAULT CHARSET=utf8


Wyciąłem kolumny, które nie biorą udziału w zapytaniu. Zresztą jest ich od cholery...
Wiem, wiem - tragedia... ale muszę to jakoś przyspieszyć ;/
Go to the top of the page
+Quote Post

Posty w temacie
- Walian   Powolne przeglądanie produktów   17.08.2010, 11:01:14
- - erix   A nie możesz po prostu wywołać dwóch zapytań? Jedn...   17.08.2010, 11:11:48
- - nospor   zrob z tego zapytania EXPLAIN i zobacz na czym mul...   17.08.2010, 11:12:02
- - Walian   Cytat("erix")A nie możesz po prostu wywo...   17.08.2010, 11:27:08
- - erix   Huh, nie zauważyłem... Pokaż lepiej [SQL] pobier...   17.08.2010, 11:28:54
- - Walian   Ale jak niby taki cache zrobić? Nie widzę tu sensu...   17.08.2010, 11:39:50
- - erix   CytatWyciąłem kolumny, które nie biorą udziału w z...   17.08.2010, 11:56:52
- - wookieb   Daj całe create table (nie usuwaj "zbędnych...   17.08.2010, 12:01:59
- - Walian   Gdybym projektował ten serwis od początku to tak w...   17.08.2010, 12:08:13
- - kaminskp   Sugeruję zastosowanie AJAX on szybko dłubie w dany...   17.08.2010, 12:11:49
- - erix   CytatNie ma to żadnego znaczenia w tym zapytaniu C...   17.08.2010, 12:13:02
- - Walian   [SQL] pobierz, plaintext CREATE TABLE `produkty` ...   17.08.2010, 12:17:04
- - wookieb   Cytat(kaminskp @ 17.08.2010, 13:11:49...   17.08.2010, 12:19:10
- - erix   Na próbę - przenieś kolumny varchar/text (tyle, il...   17.08.2010, 12:23:43
- - wookieb   Niestety MyIsam słabo spisuje się w operacjach złą...   17.08.2010, 12:39:31
- - Walian   Stworzyłem nawet nieco mniejszą tabelkę dla testu:...   17.08.2010, 12:41:42
- - dr_bonzo   Hmm, indeksy na kolumnach zlaczen są. Robisz LEFT...   17.08.2010, 13:10:57
- - Walian   Nie kumam - jeśli nie LEFT JOIN to co? Cytatbo jes...   17.08.2010, 13:44:53
- - VegetaSSJ   a wiedziałeś o tym że: [SQL] pobierz, plaintext `...   17.08.2010, 14:32:31
- - dr_bonzo   CytatNie kumam - jeśli nie LEFT JOIN to co? To INN...   17.08.2010, 14:37:27
- - Walian   Oczywiście, że wiem o tym, sęk w tym, iż numery ni...   17.08.2010, 14:38:22
- - mkozak   Przy takiej dużej ilości kluczy i kolumn w userach...   17.08.2010, 15:56:57
- - dr_bonzo   @mkozak: Ciekawe, twoje zapytanie daje: Kodid sel...   17.08.2010, 16:01:54
- - Walian   Cytat("mkozak")Przy takiej dużej ilości ...   17.08.2010, 17:16:31
|- - mkozak   Cytat(Walian @ 17.08.2010, 17:16:31 )...   17.08.2010, 17:29:12
- - Walian   Wprowadziłem nowe zapytanie + nowy indeks i wydaje...   18.08.2010, 11:05:17
- - mkozak   To już zależy od tego jak często zmienia się statu...   18.08.2010, 11:20:15
- - Walian   Status będzie się zmieniał co miesiąc - lub późnie...   18.08.2010, 12:34:35


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

 



RSS Aktualny czas: 27.12.2025 - 18:09