JavaRush /Kurslar /All lectures for UZ purposes /Маълумотларни танлаш тезлигини оптимизация қилиш

Маълумотларни танлаш тезлигини оптимизация қилиш

All lectures for UZ purposes
Daraja, Dars
Mavjud

6.1 Кириш

Энди назариядан амалга ўтамиз. «Назарияда назария ва амалиёт ўртасида фарқ йўқ. Амалда эса бор.»

Биз реал дунёда яшаймиз ва барча дастурий маҳсулотлар инсонлар учун яратилади. Ва бу инсонлар тез юкланадиган сайтларни ёқтирмайди, секин ишлайдиган дастурларни ҳам. Агар маълумотлар базасига сўров бир сониядан кўп вақт олса, бу қабул қилинмайди. Фойдаланувчилар бундай маҳсулотдан фойдаланмайди, у ерда саҳифалар ёки функционал бор бўлса, улар секин ишлайди.

Бир саҳифани кўрсатиш учун бир неча ўнлаб сўровларни бажариш керак бўлиши мумкин. Агар улар кетма-кет бажарилса, сўровга лимит 100 мсдан кўп бўлмаслиги керак.

Қуйида мен маълумотлар базасига сўровларни тезлатишнинг 5 асосий усулини келтираман:

  1. Маълумотлар базасида жадваллар учун индекслар қўшамиз.
  2. Сўровларни оптимизация қиламиз ва қайта ёзамиз.
  3. Маълумотлар базаси томонида кэшлашни ёқамиз ва созлаймиз.
  4. Клиент томонида кэшлашни ёқамиз.
  5. Маълумотлар базасини денормализация қиламиз.

Бу нарсалар билан сиз етарлича танишсиз. Келинг, сизга бир неча амалиёт маслахатларини бериб ўтамиз.

6.2 Индекслар

Маълумотлар базаси билан ишлаш ҳар қандай сайтнинг ишининг катта қисмини ташкил қилади, бу сир эмас. Ва айнан БД билан ишлаш веб-иловаларнинг тиқилиш нуқтаси ҳисобланади.

Бу ерда MySQLдан фойдаланиш учун бир неча амалий маслахатлар бўлади.

MySQLдан фойдаланиш муаммоларини уч гуруҳга бўлиш мумкин:

  1. Индекслар нотўғри фойдаланилади ёки умуман фойдаланилмайди.
  2. БДнинг структураси нотўғри.
  3. SQL сўровлар нотўғри ёки нооптимал.

Келинг, ҳар бир бу гуруҳларни батафсил кўриб чиқайлик.

Индекслардан фойдаланиш

Индексларни нотўғри фойдаланиш кўпинча сўровларни секинлаштиради. Манулда индексларни ишлаш механизмлари ҳақида ўқиб чиқишни тавсия қиламан.

Индекслардан фойдаланиш маслахатлари:

  • Барча жадвал майдонларини анализ қилмасдан индексламаслик керак.
  • Индекслар маълумотларни қидиришни тезлаштиради, аммо қўшиш ва янгилашни секинлаштиради.
  • Индекснинг муҳим параметрларидан бири - селективлик, яъни индексдаги турли қийматлар сони.
  • Кам қийматли майдонларни индекслашга ҳеч қандай маъно йўқ.
  • Муреккаб индекслардан фойдаланишда индексдаги майдонлар тартиби катта аҳамиятга эга.
  • Қамраб олувчи индекслар ҳақида унутманг. Агар сўровдаги барча маълумотларни индексдан олиш мумкин бўлса, MySQL жадвалга мурожаат қилмайди. Бу кўп вақтни тежайди. Масалан, SELECT name FROM user WHERE login='test' сўрови учун индекс (login, name) мавжуд бўлса, жадвалга мурожаат қилиш шарт эмас. Баъзан сўровни қамраб олиш ва уни тезлатиш учун индексга қўшимча майдон қўшиш мантиқан тўғри бўлади.
  • Баъзан қаторлар бўйича индекслар учун фақат қаторнинг бир қисмини индекслаш кифоя. Бу индекс ҳажмини кичрайтириши мумкин.
  • Агар % LIKE(SELECT * FROM table WHERE field LIKE '%test') бошида турса, индекслар фойдаланилмайди.
  • FULLTEXT индекс MATCH синтаксисидан фойдаланиб қаторларни қидириш учун ишлатилади, уни SELECT, UPDATE ва DELETE командасида қўллаш мумкин. Бундан ташқари, индекс қаторларни солиштириш учун AGAINST синтаксисини ҳам қўллайди, уни SELECT, INSERT ва UPDATE командасида ҳам қўллаш мумкин. Индексланганда маълум қаторлар бўйича қидириш учун кенгликни белгилаш мумкин, натижаларни фильтр қилиш учун маскани ҳам белгилаш мумкин, бу қидириш натижаларини аниқ қилиб беради.

6.3 БД Структураси

Яхши лойиҳалаштирилган маълумотлар базаси — тез ва самарали ишлаш учун асос. Бошқа томондан, ёмон лойиҳаланган БД ҳамиша ишлаб чиқувчилар учун муаммо.

БД лойиҳалаштириш бўйича маслахатлар:

  1. Минимал имконли маълумотлар турларини ишлатинг. Маълумотлар турлари қанча кўп бўлса, жадваллар сони ҳам кўпроқ бўлади, маълумотларни олиш учун дискларга мурожаат қилиш сони ҳам кўпроқ бўлади. Минимал имконли маълумотлар турларини аниқлаш учун қулай процедурадан фойдаланинг: SELECT * FROM table_name PROCEDURE ANALYSE();
  2. Лойиҳалаштириш босқичида нормал шаклларга риоя қилиш керак. Кўпинча дастурчилар денормализацияни афзал кўришаади. Лекин кўпинча бу қандай натижаларга олиб келиши мумкинлиги аввалдан тушунарсиз. Денормализация қилиш жадвални денормализациялашдан кўра осонроқ. Ундан ташқари, JOIN баъзан нотўғри денормализация қилинган жадвалларга қараганда тезроқ.
  3. Аниқ мақсад учун зарур бўлмаса NULL колонкаларни ишлатманг.

6.4 SQL сўровлар.

Ҳамма сўровларни максимал тезликка эришиш учун native SQLга қайта ёзиш истаги пайдо бўлиши мумкин. Агар шу қарорни қабул қилсангиз, сизга бир неча маслахатлар:

  • Циклда сўровлардан қочинг. SQL — бул жиҳоз тили, шунинг учун сўровлар ёзганда унга функциядек эмас, балки жиҳоздек қараш керак.
  • Сўровларда юлдузчалардан қочинг. Тўғри танланган майдонларни кўрсатинг. Бу узатилган маълумотлар сонини камайтиради. Қамраб олувчи индекслар ҳақида унутманг. Агар ҳамма майдонларни танламасангиз ҳам, уларни санаб ўтиш яхши.
  • Биринчи навбатда, бу кодни ўқишни яхшилайди. Юлдузчаларсиз жадвалда қандай майдонлар борлигини билиш мумкин. Иккинчидан, юлдузчаларни ишлатиш жадвалга янги майдонлар қўшилганда муаммоларга олиб келиши мумкин.
  • Саҳифа бўйича танлашда умумий ёзувлар сонини олиш учун SQL_CALC_FOUND_ROWS ва SELECT FOUND_ROWS()дан фойдаланинг. SQL_CALC_FOUND_ROWS MySQL ёзувлар сонини кэшлайди, SELECT FOUND_ROWS() бу қийматни бошқа сўров зарурисиз қайтаради.
  • Бир неча ёзувларни киритиш учун INSERT синтаксисидан фойдаланишни ёдда тутинг. Бир сўров циклда кўпдан кўра тезроқ.
  • Ҳамма маълумотлар керак бўлмаса LIMITдан фойдаланинг.
  • REPLACE ўрнига INSERT… ON DUPLICATE KEY UPDATE… ишлатинг.
  • GROUP_CONCAT функцияси ҳақида ёдда тутинг, бу мураккаб сўровлар билан ёрдам беради.
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION