Ez a cikk egy tükör gépi fordítás, kérjük, kattintson ide, hogy ugorjon az eredeti cikkre.

Nézet: 12934|Válasz: 2

[Tippek] Több gyakori módszer SQL utasításlekérdezések optimalizálására MySQL-ben

[Linket másol]
Közzétéve 2017. 08. 04. 16:08:46 | | |
1. A lekérdezés optimalizálásához érdemes elkerülni a teljes táblázatszkennelést, és először fontolóra venni, hogy létrehozz egy indexet az oszlopokról, amelyek hol és sorrendben szerepelnek.

2. Próbáld meg elkerülni, hogy != vagy <> operátorokat használj a where klauzuladban, különben a motor felhagy az indexek használatával és teljes táblázatszkennelést végez.

3. Próbáld elkerülni a null értékítéletet a where klausulás mezőin, különben a motor feladja az indexek használatát, és teljes táblázatszkennelést végez, például:
Válassz azonosítót a T-ből, ahol null
Beállíthatod az alapértelmezett értéket 0-nak a számon, meggyőződhetsz róla, hogy nincs null érték a táblázat num oszlopában, majd így kérdezheted:
Válassz azonosítót a T-ből, ahol num=0

4. Próbáld meg elkerülni, hogy az OR használata a hol klauzuladékban a feltételhez csatlakozzon, különben a motor feladja az indexek használatát, és teljes táblázat-szkennelést végez, például:
Válassz azonosítót a T-ből, ahol num=10 vagy num=20
Ilyen kérdéseket tehetsz:
Válassz azonosítót a T-ből, ahol num=10
Mindenki egyesülése
Válassz azonosítót a T-ből, ahol num=20

5. A következő lekérdezés teljes táblázatszkennelést eredményez:
Válassz ID-t a T-ből, ahol a név például '%ABC%'
A hatékonyság növelése érdekében fontoljuk meg a teljes szöveges keresést.

6.in és nem be-be is óvatosan kell használni, különben teljes asztalszkenneléshez vezethet, például:
Válassz ID-t a T-ből, ahol num in(1,2,3)
Folytonos értékekhez ne használd az in-t, ha használhatod a közötti:
Válassz azonosítót a T-ből, ahol az Num 1 és 3 között

7. Ha egy paramétert használsz egy hol klauzulatban, az teljes táblázatszkennelést is eredményez. Mivel az SQL csak helyi változókat oldja meg futásidőben, de az optimalizáló nem halaszthatja a hozzáférési tervek kiválasztását futásidőre; A fordításkor kell kiválasztani. Azonban, ha a fordításkor létrehoznak hozzáférési tervet, a változó értéke továbbra is ismeretlen, ezért nem használható bemeneti elemként az indexválasztáshoz. Az alábbi nyilatkozatokat teljes egészében átvizsgáljuk:
Válassz azonosítót a t-ből, ahol num=@num
Kényszerítheted a lekérdezést, hogy helyette indexet használjon:
Válassz ID-t a t-ből with(index(index(index name)), ahol num=@num

8. Próbáld meg elkerülni, hogy a where klauszadban fejezd ki a mezőket, ami arra készteti a motort, hogy elhagyja az indexek használatát a teljes táblázatszkennelés javára. Például:
Válassz azonosítót a T-ből, ahol num/2=100
A következőkre kell változtatni:
Válassz azonosítót a T-ből, ahol num=100*2

9. Próbáld meg elkerülni, hogy a where klauzulat szereplő mezőkön végrehajtsd a függvényműveleteket, ami miatt a motor feladja az indexek használatát a teljes táblázatszkennelés javára. Például:
Válassz azonosítót a t-ből, ahol substring(name,1,3)='abc' --név azonosító, amely abc-vel kezdődik
Válassz azonosítót a T-ből, ahol datediff(day,createdate,'2005-11-30')=0--'2005-11-30' generált azonosító
A következőkre kell változtatni:
Válassz azonosítót a T-ből, ahol a név például 'abc%'
Válassz azonosítót a T-ből, ahol createdate>='2005-11-30' és createdate<'2005-12-1'

10. Ne végezzen funkciókat, aritmetikai műveleteket vagy más kifejezési műveleteket a "=" bal oldalán a where klauzadban, különben a rendszer nem tudja helyesen használni az indexet.

11. Amikor az indexmezőt feltételként használjuk, ha az index összetett index, akkor az index első mezőjét kell feltételként használni, hogy biztosítsák, hogy a rendszer használja az indexet, különben az index nem lesz használatos, és a mezők sorrendje a lehető leginkább összhangban kell legyen az indexsorral.

12. Ne írj értelmetlen lekérdezéseket, például üres táblastruktúrát generálni:
Válassz col1,col2 #t-be a t-ből, ahol 1=0
Ez a kódtípus nem ad eredményhalmazt, de rendszererőforrásokat fogyaszt, ezért valami ilyesmire kell változtatni:
create table #t(...)

13. Gyakran jó választás helyettesíteni a létező betűkkel:
Válassz num-ot az a-ból, ahol num be-be (Válaszd a num-ot a b-ből)
Helyettesítse a következő állítást:
Válassz num-ot az a-ból, ahol létezik (válassz 1-et a b-ből, ahol num=a.num)

14. Nem minden index érvényes lekérdezésekhez, az SQL a táblázatban szereplő adatokon alapul a lekérdezés optimalizálásához; ha az index oszlopban nagy mennyiségű adatduplikáció van, az SQL lekérdezések nem feltétlenül használják az indexet, például egy táblázatban van egy mező a nemű, a férfi és nő szinte fele, akkor még ha az index nemre épül, nem is játszik szerepet a lekérdezés hatékonyságában.

15. Minél több index nem jobb, az index kétségtelenül javíthatja a megfelelő kiválasztó hatékonyságát, de csökkenti a behelyezés és frissítés hatékonyságát is, mert az index újraépíthető beillesztés vagy frissítés során, ezért az index építésének módját alaposan meg kell fontolni, a konkrét helyzettől függően. A legjobb, ha egy táblázatban nem lesz több mint 6 index, és ha túl sok van, fontold meg, szükséges-e indexeket építeni néhány ritkán használt oszlopon.

16. Kerüld a klaszterezett indexadat-oszlopok frissítését, amennyire csak lehet, mert a klaszterizált indexadat-oszlopok sorrendje a táblázat rekordok fizikai tárolási sorrendje, és ha az oszlop értéke változik, az egész táblázat rekordok sorrendjének módosításához vezet, ami jelentős erőforrásokat igényel. Ha az alkalmazásnak gyakran frissítenie kell a klaszterelt indexoszlopokat, akkor fontolóra kell venni, hogy az indexet klaszterelt indexként kell-e létrehozni.

17. Próbálj meg numerikus mezőket használni, és ne tervezz olyan mezőket, amelyek csak karakterként tartalmaznak numerikus információkat, ami csökkenti a lekérdezések és kapcsolatok teljesítményét, és növeli a tárolási költségeket. Ennek oka, hogy a motor egyenként hasonlítja össze a láncszál minden karakterét lekérdezések és csatlakozások feldolgozásakor, míg numerikus típusoknál csak egyszer kell összehasonlítani.

18. Használd a varchar/nvarchart a char/nchar helyett, mert először is, a hosszabb mezőtárolóhely megtakarítást jelenthet, másodszor pedig lekérdezéseknél a keresési hatékonyság viszonylag kis mezőn nyilvánvalóan magasabb.

19. Ne használd sehol a *-t válassz *-ból, cseréld a "*" betűt egy adott mezőlistára, és ne küldj vissza olyan mezőket, amelyeket nem használnak.

20. Próbálj meg táblázatváltozókat használni ideiglenes táblák helyett. Ha a táblaváltozó nagy mennyiségű adatot tartalmaz, vegyük figyelembe, hogy az index nagyon korlátozott (csak az elsődleges kulcsindex).

21. Kerüld a rendszertábla erőforrásainak fogyasztásának csökkentése érdekében a gyakori ideiglenes táblák létrehozását és törlését.

22. Az ideiglenes táblák nem használhatatlanok, és megfelelő használatuk egyes rutinokat hatékonyabbá tehet, például amikor egy adatbázist ismételten kell hivatkozással egy nagy táblában vagy egy gyakran használt táblában. Azonban egyszeri eseményeknél a legjobb exportálási táblát használni.

23. Ideiglenes tábla létrehozásakor, ha egyszerre nagy az adat beillesztése, akkor a select in (create table) (select in) (create table helyett) használhatod, hogy elkerüld a nagy mennyiségű naplót a sebesség javításában; Ha az adatmennyiség nem nagy, a rendszer tábla erőforrásainak megkönnyítése érdekében először kell létrehozni egy táblát, majd beilleszteni.

24. Ha ideiglenes táblát használnak, mindenképp törlöd az összes ideiglenes táblát a tárolt eljárás végén, először vágd le a táblát, majd hagyd el a táblát, hogy elkerüld a rendszer tábla hosszú távú zárolását.

25. Próbáld elkerülni a kurzor használatát, mert a kurzor hatékonysága gyenge; ha a kurzor által működtetett adat meghaladja a 10 000 sort, akkor érdemes újraírni.

26. A halmaz-alapú megoldásokat a problémák megoldásához érdemes keresni, mielőtt kurzor-alapú vagy ideiglenes táblamódszereket alkalmaznának, amelyek gyakran hatékonyabbak.

27. Mint az ideiglenes táblák, a kurzorok sem használhatatlanok. A FAST_FORWARD kurzorok használata kis adathalmazoknál gyakran jobb, mint más soronként feldolgozási módszerek, különösen, ha több táblára kell hivatkozni a szükséges adatok eléréséhez. Azok a rutinok, amelyek az eredményhalmazban "total" szerepelnek, általában gyorsabbak, mint azok, amelyeket a kurzorral hajtanak végre. Ha a fejlesztési idő engedi, mind kurzor-alapú, mind halmaz-alapú módszereket kipróbálhatunk, hogy megnézzük, melyik működik jobban.

28. Állítsuk be a NO COUNT -t bekapcsolni az összes tárolt eljárás és trigger elején, és a végén NO COUNT beállítást ki. Nem szükséges DONE_IN_PROC üzeneteket küldeni az ügyfélnek minden tárolt eljárás és trigger utasítás végrehajtása után.

29. Próbáld elkerülni, hogy nagy adatokat küldj vissza az ügyfélnek, ha az adatmennyiség túl nagy, gondold át, hogy a megfelelő igény ésszerű-e.

30. Próbáld elkerülni a nagy tranzakciós műveleteket, és javítsd a rendszer párhuzamossági képességeket.

Pontszám

A résztvevők száma1MB+5 hozzájárul+5 Összeomlás ok
Kis szemét + 5 + 5 Banán Program Jutalmak

Minden értékelés megtekintése





Előző:Tippek csoportos lekérdezéshez csoportonként
Következő:Találkozunk 2017. augusztus 6-án, vasárnap reggel 8:30-kor a Ruima Grand Mansion-ban
 Háziúr| Közzétéve 2017. 08. 04. 16:14:30 |
Optimalizálási elv: a kis táblák vezetnek nagy táblákat, vagyis a kis adathalmazok nagy adathalmazokat vezetnek.
 Háziúr| Közzétéve 2017. 08. 04. 16:22:14 |
A lekérdezési sebesség javítása érdekében ésszerűen hozz létre olyan indexeket, mint például
VÁLASZD a.goods_name,a.goods_number,a.goods_price,a.goods_track,b.payment,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.createtime,b.fizetés,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.remark,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 as goods_sn FROM sh_order_goods a bal csatlakozás sh_order b a.order_id=b.id bal csatlakozás sh_product c a.product_id=c.id bal csatlakozás sh_send d on a.order_id=d.order_id bal csatlakozás sh_goods e on a.goods_ id=e.id ORDER BY id DESC
Bár az ilyen adatlekérdezés képes funkciókat elérni, ha millió adatkötettel találkozik, időtúllépéseket okoz, ami komolyan a szolgáltatás összeomlásához vezethet. Az elv 1000*1000*1000, elképzelhető a lassúság, próbálj meg egyetlen táblázatot használni az adatok ellenőrzéséhez, adj össze. Különösen az e-kereskedelem a legtabubb közös kérdés.
Lemondás:
A Code Farmer Network által közzétett összes szoftver, programozási anyag vagy cikk kizárólag tanulási és kutatási célokra szolgál; A fenti tartalmat nem szabad kereskedelmi vagy illegális célokra használni, különben a felhasználók viselik az összes következményet. Az oldalon található információk az internetről származnak, és a szerzői jogi vitáknak semmi köze ehhez az oldalhoz. A fenti tartalmat a letöltés után 24 órán belül teljesen törölni kell a számítógépéről. Ha tetszik a program, kérjük, támogassa a valódi szoftvert, vásároljon regisztrációt, és szerezzen jobb hiteles szolgáltatásokat. Ha bármilyen jogsértés történik, kérjük, vegye fel velünk a kapcsolatot e-mailben.

Mail To:help@itsvse.com