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%)
-----


  1. CREATE TABLE `produkty` (
  2. `produkt_id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  3. `name` varchar(255) NOT NULL,
  4. `category_id` smallint(11) NOT NULL DEFAULT '0',
  5. `active` tinyint(4) NOT NULL DEFAULT '0',
  6. `poprawiony` tinyint(4) NOT NULL DEFAULT '0',
  7. `katalog` tinyint(4) NOT NULL DEFAULT '0',
  8. `pod_katalog` tinyint(4) NOT NULL DEFAULT '0',
  9. PRIMARY KEY (`produkt_id`),
  10. KEY `products_name` (`active`,`name`),
  11. KEY `category_id` (`category_id`),
  12. FULLTEXT KEY `name` (`name`)
  13. ) ENGINE=MyISAM AUTO_INCREMENT=913300 DEFAULT CHARSET=utf8 PACK_KEYS=0


  1. CREATE TABLE `oferty` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `user_id` mediumint(10) NOT NULL DEFAULT '0',
  4. `cena` double(16,2) NOT NULL DEFAULT '0.00',
  5. `nazwa_prod` varchar(255) NOT NULL,
  6. `link` varchar(255) NOT NULL,
  7. `offer_id` bigint(24) UNSIGNED NOT NULL,
  8. `produkt_id` int(10) UNSIGNED NOT NULL,
  9. `aktualizacja` int(8) NOT NULL,
  10. PRIMARY KEY (`id`),
  11. KEY `produkt_id` (`produkt_id`),
  12. KEY `user_id` (`user_id`),
  13. KEY `cena` (`cena`)
  14. ) ENGINE=MyISAM AUTO_INCREMENT=1359539 DEFAULT CHARSET=utf8


A teraz czas na MATRIX:
  1. CREATE TABLE `uzytkownicy` (
  2. `user_id` int(11) NOT NULL AUTO_INCREMENT,
  3. `name` varchar(100) character SET utf8 NOT NULL,
  4. `email` varchar(255) character SET utf8 NOT NULL,
  5. `birthdate` date NOT NULL DEFAULT '0000-00-00',
  6. `address` varchar(100) character SET utf8 NOT NULL,
  7. `city` varchar(50) character SET utf8 collate utf8_polish_ci NOT NULL,
  8. `state` varchar(100) character SET utf8 NOT NULL,
  9. `country` varchar(100) character SET utf8 NOT NULL,
  10. `zip_code` varchar(30) NOT NULL DEFAULT '',
  11. `phone` varchar(30) NOT NULL DEFAULT '',
  12. `username` varchar(255) NOT NULL DEFAULT '',
  13. `password` varchar(32) NOT NULL DEFAULT '',
  14. `active` tinyint(4) NOT NULL DEFAULT '0',
  15. `zdjecie_logo` varchar(255) NOT NULL,
  16. `xml_link` varchar(225) NOT NULL,
  17. `xml_nazwa` varchar(50) NOT NULL,
  18. `pp` int(3) NOT NULL DEFAULT '0',
  19. `opis_problem` varchar(255) character SET utf8 NOT NULL,
  20. `payment_status` varchar(20) NOT NULL DEFAULT '',
  21. `automat` int(11) NOT NULL DEFAULT '0',
  22. `poprawny_plik` int(3) NOT NULL DEFAULT '0',
  23. `newsletter` tinyint(4) NOT NULL DEFAULT '0',
  24. `reg_date` int(11) NOT NULL DEFAULT '0',
  25. `mail_activated` tinyint(4) NOT NULL DEFAULT '0',
  26. `lang` varchar(255) NOT NULL DEFAULT 'english',
  27. `preferred_seller` tinyint(4) NOT NULL DEFAULT '0',
  28. `promowanie_sklepu` tinyint(4) NOT NULL DEFAULT '0',
  29. `birthdate_year` int(11) NOT NULL DEFAULT '0',
  30. `referred_by` varchar(200) NOT NULL DEFAULT '',
  31. `payment_mode` tinyint(1) DEFAULT '0',
  32. `ilosc_prod` int(11) DEFAULT '0',
  33. `nazwa_sklepu` varchar(100) character SET utf8 DEFAULT NULL,
  34. `tax_account_type` tinyint(4) NOT NULL DEFAULT '0',
  35. `salt` char(3) NOT NULL DEFAULT '',
  36. `approved` tinyint(4) NOT NULL DEFAULT '0',
  37. `aktualizacja` text NOT NULL,
  38. `prom_logo` int(3) NOT NULL DEFAULT '0',
  39. `akceptacja_promowanie` int(2) NOT NULL,
  40. `aktywny` int(11) NOT NULL DEFAULT '1',
  41. PRIMARY KEY (`user_id`),
  42. KEY `shop_active` (`active`,`user_id`),
  43. KEY `stores_list` (`active`),
  44. KEY `acc_overdue_users` (`payment_mode`,`reg_date`),
  45. KEY `active_users` (`active`,`reg_date`,`approved`),
  46. KEY `users_tax_acc_type` (`tax_account_type`,`reg_date`),
  47. KEY `users_tax_exempt` (`promowanie_sklepu`,`reg_date`),
  48. KEY `active` (`active`),
  49. FULLTEXT KEY `nazwa_sklepu` (`nazwa_sklepu`),
  50. FULLTEXT KEY `city` (`city`)
  51. ) ENGINE=MyISAM AUTO_INCREMENT=100962 DEFAULT CHARSET=latin2 PACK_KEYS=0


Pewnie kilka kolumn nie jest w ogóle używanych, to się je prędzej czy później wywali.
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: 5.10.2025 - 01:06