🐢
Хостинг

MySQL секин сўровлар логи: муаммоли сўровни топиш

13.11.2026
← Барча мақолалар

Сайт секин очилса, кўпчилик биринчи навбатда хостингни ёки расмларни айблайди. Лекин динамик сайтларда секинликнинг энг кенг тарқалган манбаларидан бири базадаги бир ёки икки ноқулай сўровдир. Битта саҳифа ўнлаб сўров юбориши мумкин ва уларнинг орасида биттаси бир неча сония давом этса, бутун саҳифа шунча кутиб қолади. MySQL'нинг секин сўровлар логи айнан шу сўровларни ушлаб олиш учун яратилган ва у тахмин ўрнига аниқ далил беради.

Секин сўровлар логи қандай ишлайди

MySQL ҳар бир сўров қанча вақт бажарилганини ўлчайди. Секин сўровлар логи ёқилганда, белгиланган чегарадан узоқ давом этган ҳар бир сўров алоҳида файлга ёзилади. Бу чегара long_query_time параметри билан сонияларда берилади ва каср қиймат ҳам қабул қилади, масалан ярим сония. Логга сўров матни билан бирга унинг бажарилиш вақти, қулф кутиш вақти, қайтарилган ва кўриб чиқилган қаторлар сони ҳам ёзилади.

Охирги икки кўрсаткич айниқса фойдали. Агар сўров фойдаланувчига 20 та қатор қайтарган, лекин бунинг учун бир миллион қаторни кўриб чиққан бўлса, бу индекс етишмаслигининг аниқ белгиси. Бундай номутаносиблик кўпинча сўровнинг ўзини эмас, жадвал тузилишини ўзгартириш кераклигини кўрсатади.

Логни ёқиш

Ўз VPS серверингизда ёки администратор ҳуқуқига эга базада логни икки усулда ёқиш мумкин. Биринчиси сервер ишлаб турган пайтда буйруқ орқали, бу қайта ишга туширишсиз дарҳол кучга киради, лекин кейинги қайта ишга туширишда йўқолади:

SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';

Доимий созлама учун худди шу қийматлар MySQL конфигурация файлининг [mysqld] бўлимига ёзилади. Файл жойлашуви тизимга қараб фарқ қилади, Debian ва Ubuntu'да одатда /etc/mysql/ папкаси ичида, бошқа тизимларда /etc/my.cnf бўлади. Лог файли ёзиладиган папкага MySQL хизмати ёзиш ҳуқуқига эга бўлиши керак:

[mysqld]
slow_query_log      = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time     = 1
# indekssiz so'rovlarni ham yozish (vaqtincha, log tez o'sadi):
# log_queries_not_using_indexes = 1

long_query_time ни жуда кичик қилиб қўйсангиз, лог тез ўсиб, дискни тўлдириши мумкин. Бошланишига бир сония яхши қиймат, энг оғир муаммолар тузатилгач чегарани ярим сония ёки ундан пастга тушириб, кейинги қатламни кўриш мумкин.

Лог ёзувини ўқиш

Логдаги ҳар бир ёзув сарлавҳа қаторлари ва сўров матнидан иборат. Қуйидаги мисолда сўров уч сониядан ортиқ давом этган, фойдаланувчига 24 та қатор қайтарган, лекин бунинг учун бир миллиондан ортиқ қаторни кўриб чиққан:

# Time: 2026-11-04T10:15:32.481920Z
# User@Host: shop_user[shop_user] @ localhost []
# Query_time: 3.214  Lock_time: 0.000120 Rows_sent: 24  Rows_examined: 1184302
SET timestamp=1793787332;
SELECT * FROM products WHERE category_id = 17 ORDER BY created_at DESC LIMIT 24;

Бундай ёзувни кўриб, биринчи савол шундай бўлади: category_id ва created_at устунларида индекс борми? Кўпинча жавоб йўқ бўлиб чиқади ва MySQL ҳар сафар бутун жадвални бошидан охиригача кўриб чиқади.

Кўп ёзувни таҳлил қилиш воситалари

Гавжум сайтда лог бир кунда минглаб ёзувга етади ва уларни қўлда ўқиш мумкин эмас. MySQL билан бирга келадиган mysqldumpslow ёрдамчи дастури ўхшаш сўровларни бир гуруҳга йиғади, рақам ва сатрларни умумлаштиради ва уларни умумий вақт ёки чақирувлар сони бўйича саралайди. Қуйидаги буйруқ умумий вақт бўйича энг оғир ўнта сўровни кўрсатади:

mysqldumpslow -s t -t 10 /var/log/mysql/slow.log

Чуқурроқ таҳлил учун Percona Toolkit тўпламидаги pt-query-digest воситаси кенг қўлланилади. У ҳар бир сўров гуруҳининг умумий вақтдаги улушини фоизда кўрсатади, шунинг учун қайси тузатиш энг катта фойда беришини дарҳол кўриш мумкин. Кўпинча битта ёки иккита сўров базадаги умумий юкнинг катта қисмини ташкил қилиши маълум бўлади.

Топилган сўровни EXPLAIN билан текшириш

Муаммоли сўров топилгач, унинг бажарилиш режасини EXPLAIN буйруғи билан кўриш керак. Натижада type устунида ALL ёзилган бўлса, бу бутун жадвални кўриб чиқиш демакдир, key устуни бўш бўлса, ҳеч қандай индекс ишлатилмаган. Extra устунидаги Using filesort эса саралаш хотирада ёки дискда алоҳида бажарилаётганини билдиради:

EXPLAIN SELECT * FROM products
WHERE category_id = 17
ORDER BY created_at DESC LIMIT 24;

Кўп ҳолатда ечим фильтрлаш ва саралаш устунларига мос таркибий индекс қўшишдир. Индекс қўшилгач сўровни қайта EXPLAIN билан текширинг ва логда у қайта пайдо бўлмаётганига ишонч ҳосил қилинг.

Shared хостингда нима қилиш мумкин

Shared хостингда сервер даражасидаги лог созламаларини оддий фойдаланувчи ўзгартира олмайди, чунки улар барча мижозларга таъсир қилади. Бундай ҳолатда илова даражасидаги воситалар ёрдам беради. WordPress учун Query Monitor плагини ҳар бир саҳифада қайси сўров қанча вақт олганини кўрсатади, Laravel ва бошқа фреймворкларда эса ўз сўров логлари ва носозликларни таҳлил қилиш панеллари бор. Муайян саҳифа бўйича аниқ таҳлил керак бўлса, sayt.uz кабинетидан ёки техник ёрдам орқали сўров қолдириш мумкин.

Амалий мисол: мебель дўконининг каталог саҳифаси

Намангандаги мебель дўконининг example.uz сайти бош саҳифада тез очиларди, лекин категория саҳифалари беш-олти сония юкланарди. Кучлироқ тарифга ўтиш режалаштирилган эди, аммо аввал секин сўровлар логи бир кунга ёқилди. mysqldumpslow натижаси кўрсатдики, кечикишнинг деярли ҳаммаси юқорида кўрганимизга ўхшаш битта сўровдан келмоқда: маҳсулотлар жадвали категория ва сана бўйича индекссиз қидириларди.

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

Ўхшаш мақолалар

📦 Plesk'дан бошқа панелга кўчиш: нимани олиш ва нимага эътибор бериш керак ⏱️ Ҳар дақиқалик cron серверни қандай оғирлаштиради ва уни қандай енгиллатиш мумкин 🧪 Flask иловасини хостингга жойлаш: wсги файли, Passenger, Gunicorn ва хавфсиз созламалар 🚀 PHP 8.5: pipe оператори, URI кенгайтмаси ва бошқа янги функциялар
🌐 Тил
🇺🇿 O'zbek 🇺🇿 Ўзбек ✓ 🇷🇺 Русский 🇬🇧 English