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

Posty w temacie


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

 



RSS Aktualny czas: 21.08.2025 - 16:23