Mysql同样使用索引秒查询一个而没有获得10000xFetch时间?

时间:2017-03-08 15:51:48

标签: mysql sql performance

我遇到了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;

1 个答案:

答案 0 :(得分:0)

OR UPPER(lu.opis) LIKE UPPER('%SomeName%')

有3个性能问题:

  • OR优化不佳。实质上,必须扫描表以检查所有行。索引不太可能有所帮助。
  • UPPER(indexed-column)阻止在该列上使用索引。这很容易解决,声明该列具有“不区分大小写”的COLLATION - 即类似utf8_unicode_ci;请注意_ci
  • 由于前导通配符,
  • LIKE '%...无法使用索引。

此外,拥有

通常是愚蠢的
32497 row(s) returned

你打算用那么多行做什么?即使查询本身不是,网络传输时间也很重要。

要同时“解决”LIKEORUPPER问题,请将文本一起收集到单个表中的单个列中。然后在该列上提供FULLTEXT索引。 MATCH ... AGAINST ...运行得更快 - 至少在进行SomeName搜索时。 (LEFT JOINs是另一回事。)