6.1 Bevezetés
Most térjünk át az elméletről a gyakorlatra.
A való világban élünk, és minden szoftverterméket végső soron élő emberek számára hoznak létre. És ezeket az élő embereket nagyon idegesítik a lassan betöltődő oldalak és a lelassuló programok.
És ha egy adatbázis-lekérdezés egy másodpercnél tovább tart, ez elfogadhatatlan . A felhasználók egyszerűen nem fognak olyan terméket használni, amelynek oldalai/funkciói ilyen lassúak.
De gyakran egy oldal megjelenítéséhez több tucat lekérdezést kell végrehajtania az adatbázisban. És ha szekvenciálisan hajtódnak végre, akkor már nincs második limited, hanem mondjuk kérésenként 100 ms.
Íme az 5 legjobb módszer, amellyel a programozók felgyorsíthatják az adatbázis-lekérdezéseket:
- Indexek hozzáadása az adatbázisban lévő táblákhoz.
- Lekérdezések újraírása és optimalizálása.
- Engedélyezze (és konfigurálja) a gyorsítótárazást az adatbázis oldalán.
- Gyorsítótárazás engedélyezése a kliens oldalon.
- Adatbázis denormalizálás végrehajtása.
Ezeket a dolgokat nagyrészt már ismeri, ezért az alábbiak csak gyakorlati tanácsok lesznek.
6.2 Indexek
Nem titok, hogy az adatbázisokkal való munka szinte minden webhely munkájának nagy részét lefoglalja. És ez az adatbázissal való munkavégzés, amely leggyakrabban a webes alkalmazások szűk keresztmetszete.
Ebben a cikkben gyakorlati tanácsokat szeretnék adni a MySQL használatához.
Azonnal mondom:
- ez a cikk a MySQL-ről szól, bár az általános dolgok valószínűleg minden DBMS-re igazak.
- A cikkben leírtak az én személyes álláspontom, és nem a végső igazság.
- A tanácsok nem úgy tesznek, mintha újak lennének, és az olvasott irodalom és a személyes tapasztalatok általánosításának eredménye.
- a cikk keretein belül nem térek ki a MySQL konfigurációs kérdéseire.
A MySQL használatával kapcsolatos problémák a következő három csoportba oszthatók (fontossági sorrendben):
- Az indexekkel való visszaélés vagy azokkal való visszaélés.
- Hibás adatbázis-struktúra.
- Helytelen \ szuboptimális SQL-lekérdezések.
Nézzük meg közelebbről az egyes csoportokat.
Indexek használata
Az indexek használatának mellőzése vagy visszaélése az, ami leggyakrabban lassítja a lekérdezéseket. Azoknak, akik nem ismerik az indexek működésének mechanizmusát, vagy még nem olvastak róla a kézikönyvben, erősen ajánlom, hogy olvassák el.
Tippek az indexek használatához:
- Nem kell mindent indexelni . Az emberek gyakran anélkül, hogy megértenék a jelentést, egyszerűen indexelik a táblázat összes mezőjét. Az indexek felgyorsítják a lekérést, de lelassítják a sorbeszúrást és a frissítést, ezért az egyes indexek kiválasztásának értelmesnek kell lennie.
- Az indexre jellemző egyik fő paraméter a szelektivitás, vagyis az index különböző elemeinek száma. Nincs értelme olyan mezőt indexelni, amelynek két vagy három lehetséges értéke van. Nem sok haszna lesz egy ilyen indexnek.
- Az indexek kiválasztását egy adott tábla összes lekérdezésének elemzésével kell kezdeni. Nagyon gyakran egy ilyen elemzés után három vagy négy index helyett egy összetett indexet készíthet.
- Kompozit indexek használatakor a mezők sorrendje az indexben kritikus.
- Ne feledkezzünk meg az indexek fedezéséről sem. Ha a lekérdezés összes adata lekérhető egy indexből, akkor a MySQL nem éri el közvetlenül a táblát. Az ilyen kéréseket nagyon gyorsan teljesítik. Például egy indexet (bejelentkezés, név) tartalmazó lekérdezéshez
SELECT name FROM user WHERE login='test'
nem szükséges hozzáférni a táblához. Néha célszerű egy további mezőt hozzáadni az összetett indexhez, ami az indexet fedi és felgyorsítja a lekérdezéseket. - Sorindexeknél gyakran elegendő a sornak csak egy részét indexelni. Ez jelentősen csökkentheti az index méretét.
- Ha
%
az elején van, akkorLIKE(SELECT * FROM table WHERE field LIKE '%test')
az indexek nem kerülnek felhasználásra. - A TELJESSZÖVEG index csak a MATCH ... AGAINST szintaxissal használható .
6.3 Az adatbázis szerkezete
A jól megtervezett adatbázis az adatbázissal való gyors és hatékony munka kulcsa. Másrészt egy rosszul megtervezett adatbázis mindig fejfájást okoz a fejlesztőknek.
Adatbázis tervezési tippek:
- Használja a lehető legkisebb adattípust. Minél nagyobb az adattípus, minél nagyobb a tábla, annál több lemezelérésre van szükség az adatok beszerzéséhez. Használjon egy nagyon kényelmes eljárást:
SELECT * FROM table_name PROCEDURE ANALYSE();
határozza meg a lehetséges minimális adattípusokat. - Figyelje meg a normál formákat a tervezési szakaszban. A programozók gyakran már ebben a szakaszban a denormalizáláshoz folyamodnak. A legtöbb esetben azonban a projekt kezdetén korántsem egyértelmű, hogy ez milyen eredménnyel járhat. Egy táblázat denormalizálása sokkal könnyebb, mint egy szuboptimálisan denormalizált táblától szenvedni. És
JOIN
néha gyorsabban működik, mint a helytelenül denormalizált táblák. - Ne használjon
NULL
oszlopokat, hacsak nincs rájuk tudatosan szüksége.
6.4 SQL lekérdezések.
Ugyanilyen gyakran felmerül a vágy, hogy minden lekérdezést átírjunk natív SQL-ben, hogy a lekérdezés a lehető leggyorsabb legyen. Ha úgy dönt, hogy megteszi, íme néhány tipp:
- Kerülje el a cikluson belüli kéréseket. Az SQL a halmazok nyelve, és a lekérdezések írását nem a függvények nyelvén, hanem a halmazok nyelvén kell megközelíteni.
- Kerülje
*
a (csillagok) használatát a lekérdezésekben. Nyugodtan sorolja fel pontosan a kiválasztott mezőket. Ez csökkenti a lekért és elküldött adatok mennyiségét. Ne feledkezzünk meg az indexek fedezéséről sem. Még ha kijelöli is a táblázat összes mezőjét, jobb, ha felsorolja őket. Először is javítja a kód olvashatóságát. Csillagok használatakor lehetetlen megtudni, hogy mely mezők vannak a táblázatban anélkül, hogy megnéznénk. Másodszor , ma a táblázatban öt INT oszlop van, és egy hónappal később egy újabb SZÖVEG és BLOB került hozzáadásra , és a csillag nem változott. - Lapozáskor a rekordok teljes számának lekéréséhez használja a
SQL_CALC_FOUND_ROWS
ésSELECT FOUND_ROWS();
az When usedSQL_CALC_FOUND_ROWS MySQL
függvényt, gyorsítótárazza a kiválasztott sorszámot (a LIMIT alkalmazása előtt), és használatkorSELECT FOUND_ROWS()
csak ezt a gyorsítótárazott értéket adja vissza a lekérdezés újbóli végrehajtása nélkül. - Ne felejtse el, hogy
INSERT
több beszúráshoz van szintaxis. Egy lekérdezés egy nagyságrenddel gyorsabban fut, mint több lekérdezés egy ciklusban. - Használja
LIMIT
ott, ahol nincs szüksége minden adatra. - Használja a kijelölés
INSERT… ON DUPLICATE KEY UPDATE…
helyett ésINSERT
utánUPDATE
, gyakran pedig a helyettREPLACE
. - Ne felejtse el ezt a csodálatos funkciót
GROUP_CONCAT
. Komplex kérdésekben segíthet.
GO TO FULL VERSION