Ta članek je zrcalni članek strojnega prevajanja, kliknite tukaj za skok na izvirni članek.

Pogled: 12934|Odgovoriti: 2

[Napitnine] Več pogostih metod za optimizacijo SQL poizvedb v MySQL

[Kopiraj povezavo]
Objavljeno na 4. 08. 2017 16:08:46 | | |
1. Za optimizacijo poizvedbe se morate izogniti popolnemu pregledovanju tabel in najprej razmisliti o ustvarjanju indeksa na stolpcih, ki so vključeni v kje, in po vrstnem redu.

2. Poskusite se izogibati uporabi operatorjev != ali <> v klavzuli kje, sicer bo pogon opustil uporabo indeksov in izvedel popolno pregledovanje tabel.

3. Poskušajte se izogniti ničelni vrednostni presoji na poljih v klavzuli kje, sicer bo pogon opustil uporabo indeksov in izvedel popolno pregledovanje tabel, na primer:
Izberite ID iz T, kjer je num ničelna
Lahko nastavite privzeto vrednost 0 na num, preverite, da v stolpcu num v tabeli ni ničelne vrednosti, nato pa poizvedujete takole:
Izberi ID iz T, kjer je num=0

4. Poskusite se izogibati uporabi OR v klavzuli where za združitev pogoja, sicer bo to povzročilo, da pogon opusti uporabo indeksov in izvede celoten pregled tabele, na primer:
Izberite ID iz T, kjer je num=10 ali num=20
Lahko povprašate takole:
Izberi ID iz T, kjer je nuM=10
Združitev vseh
Izberi ID iz T, kjer je nuM=20

5. Naslednja poizvedba bo prav tako privedla do popolnega pregleda tabele:
Izberite id iz T, kjer je ime kot '%abc%'
Za večjo učinkovitost razmislite o iskanju po celotnem besedilu.

6.in in not in not in je treba uporabljati previdno, sicer bo to vodilo do popolnega pregleda tabele, kot na primer:
Izberi ID iz T, kjer Num in(1,2,3)
Za zvezne vrednosti ne uporabljajte v, če lahko uporabite med:
Izberite ID iz T, kjer je num med 1 in 3

7. Če uporabite parameter v klavzuli kje, bo to povzročilo tudi popoln pregled tabele. Ker SQL med izvajanjem rešuje le lokalne spremenljivke, optimizator pa ne more prestaviti izbire načrtov dostopa na izvajanje časa; Izbrati ga je treba ob prevajanju. Če pa je načrt dostopa vzpostavljen ob prevajanju, je vrednost spremenljivke še vedno neznana in je zato ni mogoče uporabiti kot vhodni element za izbiro indeksa. Naslednje izjave bodo skenirane v celoti:
Izberi ID iz T, kjer je NuM=@num
Poizvedbo lahko prisilite, da namesto tega uporabi indeks:
Izberite ID iz t z(index(index(index name)), kjer num=@num

8. Poskušajte se izogibati izražanju polj v klavzuli kje, saj bo pogon opustil uporabo indeksov v korist popolnega pregledovanja tabel. Na primer:
Izberi ID iz T, kjer num/2=100
naj se spremeni v:
Izberi ID iz T, kjer je num=100*2

9. Poskusite se izogibati izvajanju funkcijskih operacij na poljih v klavzuli where, kar bo povzročilo, da pogon opusti uporabo indeksov v korist popolnega pregledovanja tabel. Na primer:
Izberite ID iz T, kjer je podstring(ime,1,3)='ABC' --ID imena, ki se začne z ABC
Izberite ID iz T, kjer datediff(day,createdate,'2005-11-30')=0--'2005-11-30' generirani ID
naj se spremeni v:
Izberi ID iz T, kjer je ime kot 'abc%'
Izberite ID iz T, kjer je ustvarjeno>='2005-11-30' in ustvarjeno<'2005-12-1'

10. Ne izvajajte funkcij, aritmetičnih operacij ali drugih izraznih operacij levo od "=" v klavzuli kje, sicer sistem morda ne bo mogel pravilno uporabiti indeksa.

11. Pri uporabi indeksnega polja kot pogoja, če je indeks sestavljen, mora biti prvo polje v indeksu uporabljeno kot pogoj, da sistem uporablja indeks, sicer indeks ne bo uporabljen, in vrstni red polj mora biti čim bolj skladen z vrstnim redom indeksa.

12. Ne pišite nesmiselnih poizvedb, kot je generiranje prazne tabele:
Izberi stolpec 1,stolpec 2 v #t iz T, kjer je 1=0
Ta vrsta kode ne vrača nobenega nabora rezultatov, vendar porablja sistemske vire, zato jo je treba spremeniti v nekaj takega:
Ustvari tabelo #t(...)

13. Velikokrat je dobra izbira za zamenjavo z obstaja:
Izberi num iz A, kjer num v (izberi num iz b)
Zamenjajte z naslednjo izjavo:
Izberi num iz A, kjer obstaja (izberi 1 iz b, kjer num=a.num)

14. Niso vsi indeksi veljavni za poizvedbe, SQL temelji na podatkih v tabeli za optimizacijo poizvedbe; ko ima stolpec indeksa veliko podvajanja podatkov, SQL poizvedbe morda ne uporabljajo indeksa, na primer tabela ima spol polja, moški in ženski skoraj polovično vsak, tudi če je indeks zgrajen na spolu, ne bo igral vloge pri učinkovitosti poizvedb.

15. Več kot je indeksov, tem bolje, indeks lahko zagotovo izboljša učinkovitost ustreznega selekcije, vendar tudi zmanjša učinkovitost vstavljanja in posodabljanja, saj se indeks lahko ob vstavljanju ali posodabljanju ponovno zgradi, zato je treba natančno premisliti, kako indeks zgraditi, odvisno od specifične situacije. Najbolje je, da v tabeli ni več kot 6 indeksov, in če jih je preveč, razmislite, ali je potrebno indekse graditi na redko uporabljenih stolpcih.

16. Izogibajte se posodabljanju gručenih indeksnih podatkovnih stolpcev, kolikor je mogoče, saj je vrstni red gručenih indeksnih podatkovnih stolpcev fizični vrstni red tabel, in ko se spremeni vrednost stolpca, bo to povzročilo prilagoditev vrstnega reda celotnih zapisov tabel, kar bo porabilo znatne vire. Če mora vaša aplikacija pogosto posodabljati stolpce gručenih indeksov, morate razmisliti, ali naj indeks zgradite kot gručen indeks.

17. Poskusite uporabljati številčna polja in ne oblikovati polj, ki vsebujejo le numerične informacije kot znake, kar bo zmanjšalo zmogljivost poizvedb in povezav ter povečalo stroške shranjevanja. To je zato, ker pogon primerja vsak znak v nizu enega za drugim pri obdelavi poizvedb in združevanj, medtem ko je za numerične tipe potrebno primerjati le enkrat.

18. Uporabljajte varchar/nvarchar namesto char/nchar, kolikor je mogoče, ker najprej, daljši prostor polja lahko prihrani prostor, in drugič, pri poizvedbah je učinkovitost iskanja v razmeroma majhnem polju očitno višja.

19. Nikjer ne uporabljajte izbire * iz t, zamenjajte "*" s specifičnim seznamom polj in ne vračajte nobenih polj, ki niso uporabljena.

20. Poskusite uporabiti spremenljivke v tabeli namesto začasnih tabel. Če tabelična spremenljivka vsebuje veliko podatkov, upoštevajte, da je indeks zelo omejen (le indeks primarnega ključa).

21. Izogibajte se pogostemu ustvarjanju in brisanju začasnih tabel, da zmanjšate porabo virov sistemskih tabel.

22. Začasne tabele niso neuporabne, njihova ustrezna uporaba pa lahko nekatere rutine naredi bolj učinkovite, na primer, ko morate večkrat referencirati podatkovni niz v veliki ali pogosto uporabljeni tabeli. Vendar pa je za enkratne dogodke najbolje uporabiti izvozno tabelo.

23. Pri ustvarjanju začasne tabele, če je količina podatkov vstavljenih naenkrat velika, lahko uporabite select into namesto ustvarjanja tabele, da se izognete povzročanju prevelikega števila dnevnikov in izboljšanju hitrosti; Če količina podatkov ni velika, bi morali najprej ustvariti tabelo in jo nato vstaviti, da bi olajšali vire sistemske tabele.

24. Če se uporablja začasna tabela, poskrbite, da boste na koncu shranjenega postopka eksplicitno izbrisali vse začasne tabele, najprej tabelo skrajšali, nato pa tabelo opustili, da se sistemska tabela ne bo dolgo časa zaklenila.

25. Poskusite se izogibati uporabi kazalca, ker je učinkovitost kazalca slaba; če podatki, ki jih kazalec obdeluje, presegajo 10.000 vrstic, potem razmislite o prepisovanju.

26. Rešitve, ki temeljijo na množicah, je treba najprej iskati za reševanje problemov, preden uporabimo metode na osnovi kazalca ali začasne tabele, ki so pogosto učinkovitejše.

27. Tako kot začasne tabele tudi kazalec ni neuporaben. Uporaba FAST_FORWARD kazalca za majhne podatkovne nize je pogosto boljša kot druge metode obdelave vrstica za vrstico, še posebej, če morate za pridobitev potrebnih podatkov uporabiti več tabel. Rutine, ki vključujejo "total" v naboru rezultatov, so običajno hitrejše od tistih, ki se izvajajo s kazalcem. Če razvojni čas dopušča, lahko preizkusimo tako metode, ki temeljijo na kazalcu kot na množicah, da ugotovimo, katera deluje bolje.

28. Na začetku vseh shranjenih procedur in sprožilcev nastavite NASTAVITE NOCOUNT ON, na koncu pa nastavite NOCOUNT OFF. Po izvajanju vsakega izreka shranjene procedure in sprožilca ni treba pošiljati DONE_IN_PROC sporočil.

29. Poskušajte se izogibati vračanju velikih podatkov odjemalcu; če je podatkovni volumen prevelik, premislite, ali je ustrezna povpraševanja razumna.

30. Poskušajte se izogniti velikim transakcijam in izboljšati zmogljivosti sočasnosti sistema.

Partitura

Število udeležencev1MB+5 prispevati+5 Propad razlog
Mala drhal + 5 + 5 Nagrade programa Banana

Oglejte si vse ocene





Prejšnji:Nasveti za skupinsko poizvedbo po skupinah
Naslednji:Se vidimo ob 8:30 zjutraj v nedeljo, 6. avgusta 2017, v Grand Mansion v Ruimi
 Najemodajalec| Objavljeno na 4. 08. 2017 16:14:30 |
Načelo optimizacije: majhne tabele poganjajo velike tabele, torej majhne podatkovne zbirke poganjajo velike podatkovne zbirke.
 Najemodajalec| Objavljeno na 4. 08. 2017 16:22:14 |
Da bi izboljšali hitrost poizvedb, razumno ustvarite indekse, kot so
IZBERITE a.goods_name, a.goods_number, a.goods_price, a.goods_track, b.plačilo, b.confirm_time, b.pay_status, b.id, b.sn, b.ware_house, b.total_amount, b.final_amount, b.cpns_amount ,b.sale_amount,b.cost_amount,'goods_count','pay_status', b.ship_status,b. čas ustvarjanja,b.plačilo,b.order_status,b.pay_time,b.shr_name,b.shr_phone,b.shr_province,b.shr_ Telefon, b.shr_province, b.shr_city, b.shr_area, b.shr_address, B. opomba, b.order_from, b.send_time, b.pay_sn, c.spec_info, c.cost_price, D.Company, D.List, d.is_error, e.shop_sn kot goods_sn FROM sh_order_goods levi join sh_order b na a.order_id=b.id left join sh_product c na a.product_id=c.id left join sh_send d na a.order_id=d.order_id left join sh_goods e na a.goods_ id=e.id VRSTNI red PO id DESC
Čeprav lahko takšna podatkovna poizvedba doseže funkcije, če naleti na milijone podatkovnih količin, povzroči časovne omejitve, kar lahko resno vodi v propad storitve. Načelo je 1000*1000*1000, lahko si predstavljamo počasi, poskusi uporabiti eno tabelo za preverjanje podatkov, naredi seštevanje. Še posebej je e-trgovina najbolj tabu skupno vprašanje.
Disclaimer:
Vsa programska oprema, programski materiali ali članki, ki jih izdaja Code Farmer Network, so namenjeni zgolj učnim in raziskovalnim namenom; Zgornja vsebina ne sme biti uporabljena v komercialne ali nezakonite namene, sicer uporabniki nosijo vse posledice. Informacije na tej strani prihajajo z interneta, spori glede avtorskih pravic pa nimajo nobene zveze s to stranjo. Zgornjo vsebino morate popolnoma izbrisati z računalnika v 24 urah po prenosu. Če vam je program všeč, podprite pristno programsko opremo, kupite registracijo in pridobite boljše pristne storitve. Če pride do kakršne koli kršitve, nas prosimo kontaktirajte po elektronski pošti.

Mail To:help@itsvse.com