Faharasa za MySQL: Mwongozo wa Vitendo kwa Wasanidi
Faharasa sahihi hubadilisha swali la sekunde tano kuwa milisekunde tano. Hizi ni kanuni tunazotumia tunapobuni na kurekebisha utendaji wa hifadhidata.
Programu nyingi za kupungua tunazoombwa kuziangalia ni za kupungua kwa sababu ya faharasa chache zilizokosekana — si kwa sababu hifadhidata ni "ndogo sana". Faharasa ni uamuzi wa kubuni, na inafaa kueleweka vizuri.
Faharasa ni nini hasa
Faharasa ni nakala iliyopangwa ya safu zilizochaguliwa inayomruhusu MySQL kupata safu bila kusoma jedwali zima. Fikiria faharasa mwishoni mwa kitabu: hifadhi kidogo zaidi, kupungua kwa kiasi kikubwa kwa kurasa zilizosomwa.
Weka faharasa kwenye safu unazochuja na kuunganisha
-- Slow: full table scan
SELECT * FROM invoices WHERE status = 'unpaid' ORDER BY created_at DESC;
-- Fixed
CREATE INDEX idx_invoices_status_created ON invoices (status, created_at);
Mpangilio wa safu unamaanisha. Weka masharti ya usawa kwanza, kisha safu unayopanga au kufanya masafa.
Faharasa za pamoja hufanya kazi kushoto hadi kulia
Faharasa kwenye (status, created_at) inahudumia maswali yanayochuja kwa status, na maswali yanayochuja kwa status na kupanga kwa created_at. Haihudumii swali linalochuja tu kwa created_at. Kagua maswali yako halisi kwa EXPLAIN kabla ya kuongeza faharasa.
EXPLAIN SELECT * FROM invoices WHERE status = 'unpaid';
Tafuta type: ref au range na key yenye mantiki. type: ALL inamaanisha kuchuja zima.
Usiweke faharasa kila kitu
Kila faharasa hupunguza kasi ya maandishi na kula hifadhi. Kwenye jedwali lenye kuingizwa kwa nguvu — matukio ya mtiririko, kumbukumbu za uhakiki, data ya vihisi — kila faharasa ya ziada ni gharama halisi. Weka faharasa kwa maswali yako, si kwa mawazo.
Angalia mifumo hii
Kazi kwenye safu zilizowekewa faharasa huzima faharasa:
-- Cannot use an index on created_at
WHERE YEAR(created_at) = 2026
-- Index-friendly alternative
WHERE created_at >= '2026-01-01' AND created_at < '2027-01-01'
Alama za mwanzoni zivunja faharasa za LIKE:
WHERE name LIKE '%clinic%' -- full scan
WHERE name LIKE 'clinic%' -- can use an index
Ubadilishaji wa aina wa siri huficha faharasa: kuhifadhi kamba kwenye safu ya namba kamili, au kulinganisha VARCHAR na namba, kulazimisha MySQL kubadilisha kila safu.
Tumia faharasa za kufunika kwa maswali ya moto
Kama swali linahitaji tu safu zilizowekewa faharasa, MySQL linajibu kutoka kwenye faharasa pekee bila kugusa jedwali:
CREATE INDEX idx_cover ON invoices (status, created_at, total);
SELECT status, created_at, total FROM invoices WHERE status = 'unpaid';
Pima, usidhani
Washa kumbukumbu ya maswali ya kupungua, ipitie kila wiki kwenye uzalishaji, na rekebisha maswali yanayoumiza kwa kweli. Faharasa zilizoongezwa kwa nadharia huwa ni faharasa zisizofaa.
Lengo si hifadhidata ya kasi. Lengo ni hifadhidata ambayo mpango wake wa maswali unaelewa.