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: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>
Czy ktos pomoze w probie ustawienia odpowiednich indeksow zeby to dzialanie zoptymalizowac ?