Randallmaster
11.05.2016, 11:32:14
Tabela posiada 16 tys rekordów.
Mam zapytanie:
SELECT `d`.`id` AS `id`, (SELECT count(*) FROM `document_packing` `d2` WHERE ((`d2`.`ip` LIKE concat(`d`.`ip`,'.%')) AND (`d2`.`act` = 'Y'))) AS `under` FROM ((`document_packing` `d` )) LIMIT 1000
Zapytanie wykonuje się 5 sec... Co mogę zrobić aby to zoptymalizować?
Jakie indeksy muszę dodać?
Pyton_000
11.05.2016, 11:40:30
A coś w ten deseń?
SELECT
`d`.`id`,
COUNT(1)
FROM
`document_packing` `d`
LEFT JOIN `document_packing` `d2` ON (`d2`.`act` = 'Y' AND `d2`.`ip` LIKE CONCAT(`d`.`ip`, '.%'))
GROUP BY `d`.`id`;
I ew. pokaż EXPLAIN ze swojego zapytania.
Pyton_000
11.05.2016, 12:05:54
Pokaż dump ze struktury tabeli
Randallmaster
11.05.2016, 13:23:47
CREATE TABLE IF NOT EXISTS `document_packing` (
`id` int(11) NOT NULL,
`ip` varchar(65) NOT NULL,
`parent_id` int(11) NOT NULL DEFAULT '0',
`depth` int(11) NOT NULL DEFAULT '1',
`quantity` decimal(10,4) NOT NULL,
`quantity_packing` decimal(10,4) NOT NULL DEFAULT '0.0000',
`act` char(1) NOT NULL DEFAULT 'Y'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `document_packing`
ADD PRIMARY KEY (`id`,`ip`),
ADD UNIQUE KEY `id` (`id`,`ip`) USING BTREE,
ADD KEY `ip` (`ip`),
ADD KEY `test2` (`ip`,`act`),
ADD KEY `id_2` (`id`,`ip`);
Udało mi się w połowie rozwiązać problem. Zapytanie to posiadam w widoku i jeżeli go uruchomię to ładuje się ok 88 sec. Natomiast jeżeli zapytanie skopiuję z widoku i puszczę go bez widoku działa 0,1187, co może być tego przyczyną?
Pyton_000
11.05.2016, 13:27:28
Olej widoki, MySQL strasznie sobie z nimi radzi.
Randallmaster
11.05.2016, 13:44:42
aplikacja działa na widokach

a ja poprawiam dane