Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Optymalizacja zapytania + indeksy
Walian
post
Post #1





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

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


Mam takie zapytanie:
  1. SELECT
  2. SQL_CALC_FOUND_ROWS
  3. a.article_id,
  4. a.article_status,
  5. a.article_views,
  6. a.article_date_added,
  7. a.article_date_modified,
  8. a.article_desc,
  9. a.article_adder,
  10. a.article_last_changer,
  11. a.article_name,
  12. (
  13. SELECT
  14. m.member_level
  15. FROM
  16. members AS `m`
  17. WHERE
  18. LOWER(m.member_username)=LOWER(a.article_adder)
  19. ) AS `adder_level`,
  20. (
  21. SELECT
  22. m.member_level
  23. FROM
  24. members AS `m`
  25. WHERE
  26. LOWER(m.member_username)=LOWER(a.article_last_changer)
  27. ) AS `last_changer_level`
  28. FROM
  29. articles AS `a`
  30. WHERE
  31. a.article_category_id=1 -- tu odpowiednie Id
  32. ORDER BY
  33. a.article_date_added DESC
  34. LIMIT 0,20;


Służy do wylistowania / wyszukania artykułów dla danej kategorii.
Dodatkowo zwraca mi dodatkowe informacje o dodającym oraz o osobie, która jako ostatnia edytowała artykuł (edytować może autor lub administrator), m.in to czy dodający lub ostatni edytujący jest administratorem, czy też zwykłym użytkownikiem. Oczywiście zamiast tego zera przy limicie pojawia się odpowiedni offset (IMG:style_emoticons/default/winksmiley.jpg)

Dla testu dodałem ok. 1000 artykułów do bazy.
Niestety zapytanie zbyt długo się wykonuje, a i tak testuję to tylko na localhoście.
Czas więc zoptymalizować składnię zapytania o ile się da no i dodać indeksy.

Tabela artykułów:
  1. CREATE TABLE `articles` (
  2. `article_id` mediumint(8) UNSIGNED NOT NULL AUTO_INCREMENT,
  3. `article_category_id` tinyint(3) UNSIGNED NOT NULL DEFAULT 0,
  4. `article_status` tinyint(3) UNSIGNED NOT NULL DEFAULT 0,
  5. `article_views` int(11) UNSIGNED NOT NULL DEFAULT 0,
  6. `article_date_added` datetime NOT NULL,
  7. `article_date_modified` datetime NOT NULL,
  8. `article_desc` tinytext COLLATE utf8_polish_ci NOT NULL DEFAULT '',
  9. `article_content` mediumtext COLLATE utf8_polish_ci NOT NULL DEFAULT '',
  10. `article_adder` varchar(12) COLLATE utf8_polish_ci NOT NULL DEFAULT '',
  11. `article_last_changer` varchar(12) COLLATE utf8_polish_ci NOT NULL DEFAULT '',
  12. `article_name` varchar(64) COLLATE utf8_polish_ci NOT NULL DEFAULT '',
  13. `article_safe_name` varchar(64) COLLATE utf8_polish_ci NOT NULL DEFAULT '',
  14. PRIMARY KEY (`article_id`),
  15. UNIQUE KEY `article_name` (`article_name`),
  16. UNIQUE KEY `article_safe_name` (`article_safe_name`)
  17. ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci;

Pole member_username w tabeli members:
  1. `member_username` varchar(12) COLLATE utf8_polish_ci NOT NULL DEFAULT '',


I pytanie tak na marginesie - stosować słówko AS w zapytaniach czy lepiej skrócony zapis bez tego słowa kluczowego?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Mchl
post
Post #2





Grupa: Zarejestrowani
Postów: 855
Pomógł: 145
Dołączył: 17.07.2008
Skąd: High Memory Area

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


Podzapytania w liście pól wykonują się dla każdego wiersza tabeli 'articles'. Pora zapoznać się ze złączeniami.

Kod
<pre>   SELECT
       SQL_CALC_FOUND_ROWS
       a.article_id,
       a.article_status,
       a.article_views,
       a.article_date_added,
       a.article_date_modified,
       a.article_desc,
       a.article_adder,
       a.article_last_changer,
       a.article_name,
       ad.member_level as `adder_level`,
       alc.member.level as `last_changer_level`
       FROM
          articles as `a`
       INNER JOIN
         members AS ad
       ON
         LOWER(ad.member_username)=LOWER(a.article_adder)
       INNER JOIN
         members AS alc
       ON
         LOWER(alc.member_username)=LOWER(a.article_last_changer)
       WHERE
          a.article_category_id=1 -- tu odpowiednie Id
       ORDER BY
          a.article_date_added DESC
      LIMIT 0,20;


Ten post edytował Mchl 20.02.2010, 17:18:26
Go to the top of the page
+Quote Post

Posty w temacie


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: 3.10.2025 - 01:37