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:
SELECT `firma`.id FROM `firmy` AS `firma` LEFT JOIN `firma_branza` AS `firmabranza` ON (`firma`.`id` = `firmabranza`.`id_firma`) WHERE `id_branza_1` = '455' AND `status` = '1' ORDER BY `priorytet` DESC LIMIT 20 OFFSET 0
Budowa tabeli firmy:
CREATE TABLE `firmy` ( `id` INT(10) NOT NULL AUTO_INCREMENT, `status` TINYINT(1) NULL DEFAULT '1', `nazwa_rejestrowa` VARCHAR(255) NULL DEFAULT NULL, `kod_pocztowy` CHAR(6) NULL DEFAULT NULL, `id_wojewodztwo` TINYINT(3) NOT NULL, `miejscowosc` VARCHAR(50) NULL DEFAULT NULL, `ulica_nr` VARCHAR(100) NULL DEFAULT NULL, `telefon1` VARCHAR(50) NULL DEFAULT NULL, `fax` VARCHAR(20) NULL DEFAULT NULL, `email` VARCHAR(50) NULL DEFAULT NULL, `www` VARCHAR(50) NULL DEFAULT NULL, `priorytet` SMALLINT(3) NOT NULL DEFAULT '1', PRIMARY KEY (`id`, `priorytet`), INDEX `FK_firmy_users` (`id_user`), INDEX `index_id_wojewodztwo` (`id_wojewodztwo`), INDEX `nazwa_rejestrowa` (`nazwa_rejestrowa`), INDEX `status_priorytet` (`status`, `priorytet`) ) COLLATE='utf8_general_ci' ENGINE=InnoDB;
Budowa tabeli zlaczeniowej branz:
CREATE TABLE `firma_branza` ( `id` INT(10) NOT NULL AUTO_INCREMENT, `id_firma` INT(10) NOT NULL, `id_branza_1` INT(10) NULL DEFAULT NULL, `id_branza_2` INT(10) NULL DEFAULT NULL, `id_branza_3` INT(10) NULL DEFAULT NULL, PRIMARY KEY (`id`), INDEX `FK_firma_branza_firmy` (`id_firma`), INDEX `id_branza_2` (`id_branza_2`), INDEX `id_branza` (`id_branza_1`, `id_branza_2`, `id_branza_3`), CONSTRAINT `firma_branza_ibfk_1` FOREIGN KEY (`id_firma`) REFERENCES `firmy` (`id`), CONSTRAINT `firma_branza_ibfk_2` FOREIGN KEY (`id_branza_2`) REFERENCES `branze` (`id`) ) COLLATE='utf8_general_ci' ENGINE=InnoDB;
Wynik explain zapytania pokazuje taki rezultat (niepokojacy dla tabeli firma_branza):
<table name="UnknownTable"> <row> <id>1</id> <select_type>SIMPLE</select_type> <type>ref</type> <possible_keys>FK_firma_branza_firmy,id_branza</possible_keys> <key>id_branza</key> <key_len>5</key_len> <ref>const</ref> <rows>129168</rows> <Extra>Using where; Using temporary; Using filesort</Extra> </row> <row> <id>1</id> <select_type>SIMPLE</select_type> <type>ref</type> <possible_keys>PRIMARY,status_priorytet</possible_keys> <key>PRIMARY</key> <key_len>4</key_len> <ref>okf.firmabranza.id_firma</ref> <rows>1</rows> <Extra>Using where</Extra> </row> </table>
Czy ktos pomoze w probie ustawienia odpowiednich indeksow zeby to dzialanie zoptymalizowac ?