Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Dlugie zapytanie przy JOIN i ORDER BY
gpi
post 20.04.2012, 09:44:55
Post #1





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 29.09.2008

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


Witam,
mam dosc spora baze (ok. 3 mln rekordow) z firmami w ktorej pojawil mi sie problem przy zapytaniu ktore pobiera dane firmy wg. okreslonej branzy, a wyniki sortuje po polu liczbowym - 'priorytet'. Tabele mam w innoDB a czas query siega 20sekund:

Oto zapytanie:
  1. SELECT `firma`.id FROM `firmy` AS `firma` LEFT JOIN `firma_branza` AS `firmabranza`
  2. ON (`firma`.`id` = `firmabranza`.`id_firma`) WHERE `id_branza_1` = '455'
  3. AND `status` = '1' ORDER BY `priorytet` DESC LIMIT 20 OFFSET 0


Budowa tabeli firmy:
  1. CREATE TABLE `firmy` (
  2. `id` INT(10) NOT NULL AUTO_INCREMENT,
  3. `status` TINYINT(1) NULL DEFAULT '1',
  4. `nazwa_rejestrowa` VARCHAR(255) NULL DEFAULT NULL,
  5. `kod_pocztowy` CHAR(6) NULL DEFAULT NULL,
  6. `id_wojewodztwo` TINYINT(3) NOT NULL,
  7. `miejscowosc` VARCHAR(50) NULL DEFAULT NULL,
  8. `ulica_nr` VARCHAR(100) NULL DEFAULT NULL,
  9. `telefon1` VARCHAR(50) NULL DEFAULT NULL,
  10. `fax` VARCHAR(20) NULL DEFAULT NULL,
  11. `email` VARCHAR(50) NULL DEFAULT NULL,
  12. `www` VARCHAR(50) NULL DEFAULT NULL,
  13. `priorytet` SMALLINT(3) NOT NULL DEFAULT '1',
  14. PRIMARY KEY (`id`, `priorytet`),
  15. INDEX `FK_firmy_users` (`id_user`),
  16. INDEX `index_id_wojewodztwo` (`id_wojewodztwo`),
  17. INDEX `nazwa_rejestrowa` (`nazwa_rejestrowa`),
  18. INDEX `status_priorytet` (`status`, `priorytet`)
  19. )
  20. COLLATE='utf8_general_ci'
  21. ENGINE=InnoDB;


Budowa tabeli zlaczeniowej branz:
  1. CREATE TABLE `firma_branza` (
  2. `id` INT(10) NOT NULL AUTO_INCREMENT,
  3. `id_firma` INT(10) NOT NULL,
  4. `id_branza_1` INT(10) NULL DEFAULT NULL,
  5. `id_branza_2` INT(10) NULL DEFAULT NULL,
  6. `id_branza_3` INT(10) NULL DEFAULT NULL,
  7. PRIMARY KEY (`id`),
  8. INDEX `FK_firma_branza_firmy` (`id_firma`),
  9. INDEX `id_branza_2` (`id_branza_2`),
  10. INDEX `id_branza` (`id_branza_1`, `id_branza_2`, `id_branza_3`),
  11. CONSTRAINT `firma_branza_ibfk_1` FOREIGN KEY (`id_firma`) REFERENCES `firmy` (`id`),
  12. CONSTRAINT `firma_branza_ibfk_2` FOREIGN KEY (`id_branza_2`) REFERENCES `branze` (`id`)
  13. )
  14. COLLATE='utf8_general_ci'
  15. ENGINE=InnoDB;


Wynik explain zapytania pokazuje taki rezultat (niepokojacy dla tabeli firma_branza):

  1. <table name="UnknownTable">
  2. <row>
  3. <id>1</id>
  4. <select_type>SIMPLE</select_type>
  5. <table>firmabranza</table>
  6. <type>ref</type>
  7. <possible_keys>FK_firma_branza_firmy,id_branza</possible_keys>
  8. <key>id_branza</key>
  9. <key_len>5</key_len>
  10. <ref>const</ref>
  11. <rows>129168</rows>
  12. <Extra>Using where; Using temporary; Using filesort</Extra>
  13. </row>
  14. <row>
  15. <id>1</id>
  16. <select_type>SIMPLE</select_type>
  17. <table>firma</table>
  18. <type>ref</type>
  19. <possible_keys>PRIMARY,status_priorytet</possible_keys>
  20. <key>PRIMARY</key>
  21. <key_len>4</key_len>
  22. <ref>okf.firmabranza.id_firma</ref>
  23. <rows>1</rows>
  24. <Extra>Using where</Extra>
  25. </row>



Czy ktos pomoze w probie ustawienia odpowiednich indeksow zeby to dzialanie zoptymalizowac ?
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 Wersja Lo-Fi Aktualny czas: 14.08.2025 - 15:11