我遇到了db web app的性能问题。我尝试将索引添加到表“以获得一些时间”。它有点工作。使用索引我得到时间差异从20秒到3秒什么都可以,但问题是持续时间减少了没关系但是提取从0,001增加到大约16秒?! 有没有人遇到过这样的问题?
具有相同搜索数据的查询的时间:
Duration / Fetch Duration / Fetch
Orignal query Query with index
17.375 sec / 0.016 sec 5.047 sec / 15.140 sec 27197 row(s) returned
17.141 sec / 0.031 sec 2.047 sec / 15.844 sec 32497 row(s) returned
15.984 sec / 0.015 sec 2.938 sec / 16.562 sec 19532 row(s) returned
15.515 sec / 0.000 sec 18.406 sec / 0.000 sec 91 row(s) returned
15.906 sec / 0.015 sec 5.891 sec / 15.390 sec 10278 row(s) returned
SELECT u.id AS ID
from urzadzenie u
LEFT OUTER JOIN przedmiot pr ON u.id = pr.id_urzadzenie AND pr.del = 0
LEFT OUTER JOIN ozf_przedmiot ozf ON ozf.id_przedmiot = pr.id AND ozf.del = 0
LEFT OUTER JOIN zamowienie zm ON zm.id = ozf.id_zamowienie AND zm.del = 0
LEFT OUTER JOIN instalacja_urzadzenia i ON u.id = i.id_urzadzenie AND data_usuniecia IS NULL
LEFT OUTER JOIN lokalizacja_urzadzenia lu ON lu.id = i.id_lokalizacja
LEFT OUTER JOIN obiekt o ON i.id_obiekt = o.id
LEFT OUTER JOIN podmiot p ON o.id_podmiot = p.id,wersja_urzadzenia w, typ_urzadzenia t,kategoria_urzadzenia k
LEFT OUTER JOIN urzadzenie_uwagi uuw ON uuw.id = (select max(id) from urzadzenie_uwagi uw WHERE uw.del = 0 AND uw.id_urzadzenie = u.id AND uw.id_urzadzenie_uwagi_rodzaj in (1,2,3,11,12,13))
WHERE ((UPPER(k.nazwa) LIKE UPPER('%SomeName%') OR UPPER(t.nazwa) LIKE UPPER('%SomeName%')
OR UPPER(concat(t.nazwa, '-', w.nazwa)) LIKE UPPER('%SomeName%') OR UPPER(u.nr_ewidencyjny) LIKE UPPER('%SomeName%')
OR UPPER(u.nr_ewidencyjny2) LIKE UPPER('%SomeName%') OR UPPER(p.nazwa) LIKE UPPER('%SomeName%')
OR UPPER(lu.opis) LIKE UPPER('%SomeName%') OR UPPER(u.data_produkcji) LIKE UPPER('%SomeName%')) )
AND(u.del = 0 AND u.id_wersja = w.id AND w.id_typ = t.id AND t.id_kategoria = k.id)
ORDER BY ID DESC;
SELECT u.id AS ID
from urzadzenie u use index(part_of_name5)
LEFT OUTER JOIN przedmiot pr ON u.id = pr.id_urzadzenie AND pr.del = 0
LEFT OUTER JOIN ozf_przedmiot ozf use index(part_of_name1) ON ozf.id_przedmiot = pr.id AND ozf.del = 0
LEFT OUTER JOIN zamowienie zm ON zm.id = ozf.id_zamowienie AND zm.del = 0
LEFT OUTER JOIN instalacja_urzadzenia i ON u.id = i.id_urzadzenie AND data_usuniecia IS NULL
LEFT OUTER JOIN lokalizacja_urzadzenia lu ON lu.id = i.id_lokalizacja
LEFT OUTER JOIN obiekt o ON i.id_obiekt = o.id LEFT OUTER JOIN podmiot p ON o.id_podmiot = p.id,wersja_urzadzenia w, typ_urzadzenia t,kategoria_urzadzenia k
LEFT OUTER JOIN urzadzenie_uwagi uuw ON uuw.id = (select max(id) from urzadzenie_uwagi uw WHERE uw.del = 0 AND uw.id_urzadzenie = u.id AND uw.id_urzadzenie_uwagi_rodzaj in (1,2,3,11,12,13))
WHERE ((UPPER(k.nazwa) LIKE UPPER('%SomeName%') OR UPPER(t.nazwa) LIKE UPPER('%SomeName%')
OR UPPER(concat(t.nazwa, '-', w.nazwa)) LIKE UPPER('%SomeName%') OR UPPER(u.nr_ewidencyjny) LIKE UPPER('%SomeName%')
OR UPPER(u.nr_ewidencyjny2) LIKE UPPER('%SomeName%') OR UPPER(p.nazwa) LIKE UPPER('%SomeName%')
OR UPPER(lu.opis) LIKE UPPER('%SomeName%') OR UPPER(u.data_produkcji) LIKE UPPER('%SomeName%')) )
AND(u.del = 0 AND u.id_wersja = w.id AND w.id_typ = t.id AND t.id_kategoria = k.id)
ORDER BY ID DESC;
答案 0 :(得分:0)
OR UPPER(lu.opis) LIKE UPPER('%SomeName%')
有3个性能问题:
OR
优化不佳。实质上,必须扫描表以检查所有行。索引不太可能有所帮助。UPPER(indexed-column)
阻止在该列上使用索引。这很容易解决,声明该列具有“不区分大小写”的COLLATION
- 即类似utf8_unicode_ci
;请注意_ci
。LIKE '%...
无法使用索引。此外,拥有
通常是愚蠢的32497 row(s) returned
你打算用那么多行做什么?即使查询本身不是,网络传输时间也很重要。
要同时“解决”LIKE
,OR
和UPPER
问题,请将文本一起收集到单个表中的单个列中。然后在该列上提供FULLTEXT
索引。 MATCH ... AGAINST ...
运行得更快 - 至少在进行SomeName
搜索时。 (LEFT JOINs
是另一回事。)