Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. MySQL

Напісанне вокамгненна MySQL запытаў

by
Difficulty:IntermediateLength:LongLanguages:

Belarusian (беларуская мова) translation by Alex Grigorovich (you can also view the original English article)

Адрозненні паміж добра напісана SQL і ня шырокія, а таксама пры вытворчасці на ўчастку высокага попыту яны выклікаюць сур'ёзныя наступствы для прадукцыйнасці і надзейнасці абслугоўвання. У гэтым кіраўніцтве я распавяду, як пісаць хуткія запыты і якія фактары спрыяюць таму, што ім працаваць павольна.

Чаму MySQL?

Сёння ёсць шмат размоў пра вялікія дадзеных і новых тэхналогіях. NoSQL і хмарных рашэнняў вялікія, але шмат папулярных вэб-праграмнага забеспячэння (напрыклад, WordPress, PhpBB, Drupal, праграмнае забеспячэнне VBulletin форум і г.д.) па-ранейшаму працуе на MySQL. Міграцыя гэтых новых рашэнняў не можа быць гэтак жа проста, як толькі аптымізаваць канфігурацыю ў вас ужо ёсць у вытворчасці. Акрамя таго, прадукцыйнасць MySQL вельмі добра, асабліва версія Percona.

Не рабіце вы распаўсюджаную памылку кідаць усё больш і больш вылічальнай магутнасці пры працы з праблемай павольных запытаў і высокіх нагрузках сервера, а не на самай справе рашэнне корань, які ляжыць у аснове праблем. Даданне працэсара харчавання, SSD-назапашвальнікаў ці RAM з'яўляецца адной з формаў аптымізацыі, калі вы хочаце, але гэта не тое, што я буду казаць тут. Акрамя таго, без аптымізацыі сайта, як вы расце з апаратнымі выгадамі пытанні будуць размнажацца ў геаметрычнай прагрэсіі. Такім чынам, гэта не з'яўляецца цвёрдым доўгатэрміновым рашэннем.

Будучы добра SQL заўсёды з'яўляецца жыццёва важным інструментам для вэб-распрацоўнікаў, і выпраўленне часта быць так проста, як толькі даданне індэкса або злёгку змяняючы, як выкарыстоўваецца табліца, гэта сапраўды дапамагае ведаць, як выкарыстоўваць РСУБД добра. У гэтым выпадку мы канцэнтруемся на папулярнай СКБД з адчыненым зыходным кодам часта выкарыстоўваецца ў спалучэнні з PHP, і гэта MySQL.

Хто гэта кіраўніцтва для?

Вэб-распрацоўшчыкі, архітэктары баз даных / Абд і сістэмныя адміністратары, якія знаёмыя з MySQL. Калі вы не знаёмыя з MySQL, як пачатковец, то гэта кіраўніцтва, хутчэй за ўсё, не будзе мець вялікага сэнсу, але я буду старацца трымаць яго максімальна інфарматыўным для пачаткоўцаў у MySQL.

Back Up First

Я рэкамендую паспрабаваць крокі, прыведзеныя на ўласнай базе дадзеных MySQL (рэзервовае капіраванне ўсяго першага, вядома!). Калі ў вас няма якіх-небудзь дадзеных для працы на, напрыклад, ствараць схемы базы дадзеных пры ўмове, калі гэта дастасавальна.

Рэзервовае капіраванне MySQL лёгка з дапамогай утыліты каманднага радка mysqldump:

Вы можаце даведацца больш пра mysqldump.

Што робіць запыт павольна?

Карацей кажучы, і не ў парадку важнасці, наступныя усе гуляюць важныя фактары ў запыце і прадукцыйнасці сервера:

  • індэксы табліц
  • Там, Where частка (і выкарыстанне ўнутраных функцый, такіх як MySQL IF і дата, напрыклад)
  • сартаванне з Order By
  • Частата адначасовых запытаў
  • тып захоўвання рухавіка (InnoDB, MyISAM, Memory, Blackhole)
  • не выкарыстоўваючы Percona выданне
  • Зменныя канфігурацыі сервера (налада my.cnf / my.ini)
  • вялікія наборы вынікаў (> 1000 радкоў)
  • непастаянныя злучэння
  • Sharding канфігурацыі / кластара
  • дрэнны дызайн стала

Мы будзем разглядаць усе гэтыя вобласці ў рамках дадзенага кіраўніцтва. Акрамя таго, калі вы не выкарыстоўваеце яго, калі ласка, усталюйце Percona, якая з'яўляецца прыдатнай заменай для MySQL, які прынясе сур'ёзны прырост прадукцыйнасці. Каб убачыць кропку адліку Percona супраць MySQL, паглядзіце гэта параўнанне.

Якія індэксы?

Індэксы выкарыстоўваюцца MySQL, каб знайсці радкі з пэўнымі значэннямі слупкоў хутка, напрыклад, ўнутры WHERE. Без індэкса, MySQL павінен пачынацца з першым радком, а затым прачытаць усю табліцу, каб знайсці адпаведныя радкі. Чым больш табліца, тым больш гэта варта.

Калі табліца мае індэкс для слупкоў ў пытанні, MySQL можа хутка вызначыць пазіцыю шукаць у сярэдзіне файла дадзеных без неабходнасці глядзець на ўсіх дадзеных. Гэта значна хутчэй, чым чытанне кожнага радка паслядоўна.

Непастаянныя злучэння?

Калі мова сцэнарыяў злучаецца з базай дадзеных, калі вы наладзілі пастаянныя злучэння, то ён будзе мець магчымасць паўторна выкарыстоўваць існае злучэнне без неабходнасці ствараць новую. Гэта з'яўляецца аптымальным для выкарыстання вытворчасці і павінна быць уключана.

карыстальнікі PHP могуць чытаць далей у Кіраўніцтве па PHP.

Зніжэнне частоты адначасовых запытаў

Самы хуткі, самы эфектыўны спосаб я знайшоў, каб выправіць гэта з дапамогай выкарыстоўваючы ключ-значэнне пару крамы, такія як Memcached або Redis.

З Memcache вы можаце проста кэшаваць змесціва запыту з наступнымі, напрыклад:

Цяпер прыклад LEFT JOIN запыт будзе выконвацца толькі адзін раз кожныя 86400 секунд (24 гадзіны), такім чынам, прымаючы велізарная колькасць нагрузкі удалечыні ад сервера MySQL і скарачэння адначасовых злучэнняў.

Заўвага: PREPEND р: да хост-аргумент на MySQLi для пастаянных злучэнняў.

Sharding / кластарызацыя

Калі вашы дадзеныя атрымлівае вялікі ці попыт для пандусаў паслуг ўверх, паніка можа ўсталяваць ст. Хуткае выпраўленне для забеспячэння вашай службы застаецца ў Інтэрнэце можа быць сегментаванне. Але я не рэкамендую, таму што па сваёй сутнасці Sharding, здаецца, робіць структуры дадзеных занадта складанымі. І як растлумачана вельмі красамоўна ў гэтым артыкуле з блога Percona, ня Шардэн.

Дрэнна Дызайн табліцы

Стварэнне схемы базы дадзеных не занадта цяжка, калі вы прымаеце некаторыя залатыя правілы, такія як праца з абмежаваннямі, і ведаючы пра тое, што будзе эфектыўнай. Захаванне малюнкаў у базе дадзеных як BLOB-тыпаў дадзеных, напрыклад, вельмі непажадана; захавання файла ў Стоўбцах Тып дадзеных VARCHAR Тып значна вышэй.

Забеспячэнне таго, што дызайн з'яўляецца правільным для патрабаванага выкарыстання мае першараднае значэнне ў стварэнні вашага прыкладання. Трымаеце канкрэтныя дадзеныя асобна (напрыклад, катэгорыі і пасады) і забяспечыць шмат-да-аднаму або адзін-да-шматлікім можа быць лёгка звязаны з ідэнтыфікатарамі. Выкарыстоўваючы FOREIGN KEY сродак MySQL ідэальна падыходзяць для каскадных непрадбачаных дадзеных паміж табліцамі.

Пры пабудове вашай табліцы, паспрабуйце памятаць наступнае:

  • Выкарыстоўвайце мінімум вам трэба, каб атрымаць працу; быць рэдкімі і да кропкі.
  • Не чакайце, MySQL, каб зрабіць свой бізнэс-логіку або быць праграмна-то павінна быць зроблена сапраўды перад устаноўкай на ваш мова сцэнарыяў. Напрыклад, калі вам патрэбна рандомизация спісу, зрабіць рандомизации масіва ў PHP, а не ў якасці ORDER BY ў MySQL.
  • Выкарыстоўвайце UNIQUE тып індэкса для унікальных набораў дадзеных і выкарыстаць ON DUPLICATE KEY UPDATE, каб захаваць DateTime або Отметка часу Unix абноўленае, напрыклад, у апошні раз радок была праверана.
  • Выкарыстоўвайце тып дадзеных INT для цэлалікавых numericals. Калі вы не паказаць даўжыню, MySQL будзе вылічыць, што патрабуецца сам.

Асновы аптымізацыі

Для эфектыўнай аптымізацыі, мы павінны глядзець на тры асноўных набораў дадзеных, якія тычацца вашага прыкладання:

  1. Аналіз (павольнае пратакаляванне запытаў, аўдыт, запыты і дызайн табліцы аналіз)
  2. Патрабаванні да прадукцыйнасці (колькі карыстальнікаў, што попыт)
  3. Абмежаванні тэхналогіі (хуткасць апаратных сродкаў, задаючы занадта шмат MySQL)

Аналіз можна зрабіць некалькімі спосабамі. Па-першае, мы возьмем самы прамы шлях да зазіраючы пад капотам запытаў MySQL. Першы інструмент у вашай аптымізацыі інструментаў з'яўляецца EXPLAIN. Выкарыстоўваючы гэта ў запыце да SELECT, дасць вам наступную выснову:

Стоўбцы, пералічаныя кожны трум карыснай інфармацыі пра запыт выконваецца. Стоўбцы, якія неабходна звярнуць пільную ўвагу на гэта possible_keys і Extra.

possible_keys будзе адлюстроўваць індэксы, рухавік MySQL мае ў распараджэнні выкарыстоўваць для запыту. Часам патрабуецца, каб прымусіць індэкс, каб забяспечыць запыт выконваецца ў самыя кароткія чынам.

Дадатковы слупок Extra будзе паказваць Ці WHERE, дзе і быў выкарыстаны ORDER BY. Найбольш важна адзначыць, калі з'яўляецца Using FileSort. Разгледзім наступны прыклад:

Гэты тып запыту можа атрымаць на дыск з-за ўмоўныя дзе, якое адбываецца, калі мы паглядзім на EXPLAIN:

Так што гэты запыт мае магчымасць выкарыстоўваць два індэкс і ў цяперашні час ён дзівіць дыск з-за Using FileSort ў Extra.

Што Using FileSort робіць вызначаецца тут з кіраўніцтва MySQL:

«MySQL павінен зрабіць дадатковы праход, каб даведацца, як атрымаць радкі ў адсартаваным парадку. Сартаванне выконваецца, прайшоўшы праз усе радкі ў адпаведнасці з тыпам далучэння і захоўвання ключа сартавання і паказальнік на радок для ўсіх радкоў, якія адпавядаюць WHERE ўмова. Клавішы затым сартуюцца і радкі здабываюцца ў адсартаваным парадку «.

Гэты дадатковы праход замарудзіць ваша прыкладанне і варта пазбягаць любой цаной. Яшчэ адзін важны вынік Extra, каб пазбегнуць гэта, Using temporary характар, што азначае, MySQL павінен стварыць часовую табліцу для запыту. Відавочна, што гэта агіднае выкарыстанне MySQL і яго варта пазбягаць любой цаной, калі вы не можаце аптымізаваць далей з-за патрабаванняў да дадзеных. У гэтым выпадку запыт павінен быць кэшуюцца ў Redis або Memcache, а не бегчы ад карыстальнікаў.

Каб вырашыць гэтую праблему Using FileSort мы павінны забяспечыць MySQL выкарыстоўвае INDEX. Ён мае некалькі possible_keys на выбар, але MySQL можа выкарыстоўваць толькі адзін індэкс ў канчатковым запыце. Хоць індэксы могуць быць складзеныя з некалькіх слупкоў, адваротнае не дакладна, хоць вы можаце прадаставіць падказкі для аптымізатар MySQL, якія індэксы вы стварылі.

паказальнік падказкі

аптымізатар MySQL будзе выкарыстоўваць статыстыку на аснове табліц запытаў, каб выбраць найлепшы паказчык для вобласці запыту. Ён робіць гэта на аснове статыстычнай логікі убудаваны ў аптымізатар, хоць і з некалькі варыянтаў гэта не заўсёды можа быць правільным без намякаючы. Для забеспячэння выкарыстоўваецца правільны ключ (або не выкарыстоўваецца), выкарыстоўваць FORCE INDEX, USE INDEX і IGNORE INDEX ключавых слоў у запыце. Вы можаце прачытаць больш пра індэксе намякаючы ў кіраўніцтве па MySQL.

Для таго, каб паглядзець на ключы табліцы, выкарыстоўвайце каманду SHOW INDEX.

Вы можаце паказаць некалькі падказак для аптымізатар выкарыстоўваць, напрыклад:

Цяпер, калі MySQL мае index_status з табліцы выкарыстоўваць, запыт фіксаваны.

Нароўні з EXPLAIN з'яўляецца DESCRIBE ключавое слова. З DESCRIBE вы можаце праглядзець інфармацыю пра выгляд табліцы, як паказана ніжэй:

даданне індэксаў

Для стварэння індэксаў у MySQL з сінтаксісам CREATE INDEX. Ёсць некалькі водараў азначніка. FULLTEXT выкарыстоўваецца для мэтаў пошуку паўнатэкставых, а затым ёсць UNIQUE тып для забеспячэння дадзеных захоўваюцца унікальным.

Для дадання індэкса ў табліцу, выкарыстоўвайце наступны сінтаксіс, напрыклад:

Гэта дазволіць стварыць індэкс users табліцы, якія будуць выкарыстоўваць першыя 10 літар калонкі імя карыстальніка, які з'яўляецца тыпам VARCHAR дадзеных.

У гэтым выпадку любыя пошукі, якія патрабуюць WHERE сартавання па імені карыстальніка з матчам, знаходзячыся ў першых 10 сімвалаў будуць такім жа, як пошук ўсёй табліцы.

складовыя індэксы

Індэксы маюць велізарны ўплыў на хуткасці, неабходнае для вяртання дадзеных запыту. Проста усталяваўшы першасны ключ і ўнікальны індэкс, як правіла, не дастаткова кампазіт ключы, дзе рэальная налада ніша ляжыць у MySQL, і часцей за ўсё гэта патрабуе A / праверкі з EXPLAIN B.

Напрыклад, калі нам трэба спасылацца на дзве калонкі ў нашым WHERE ўмоўныя, складовай ключ будзе ідэальным.

Вось гэты ключ ствараецца на поле username а з папярэдняга прыкладу і слупка active, тыпу дадзеных ENUM, што пазначае, актыўная Ці уліковы запіс карыстальніка. Так што цяпер, калі запытваюцца зьвесткі для WHERE імя карыстальніка, з'яўляецца сапраўдным, і кошт active = 1, то набор дадзеных зараз аптымізаваны для апрацоўкі гэтага лепш.

Як хутка Ваша MySQL?

Ўключыць прафіляванне больш уважліва зірнуць на вашы запыты MySQL. Гэта можа быць зроблена падчас выканання з дапамогай set profiling = 1, а затым выконвае запыт і глядзіць на вынік show profiles.

З PDO вось фрагмент кода, які робіць толькі што:

Калі вы не выкарыстоўваеце PDO, тое ж самае можна зрабіць з MySQLi, як так:

Гэта верне вам дадзеныя прафілявання, які будзе ўключаць у сябе час выканання ў другім значэнні асацыятыўнага масіва:

Запыт заняў 0.00024300 секунд. Гэта досыць хутка, каб не турбавацца. Але калі лік спаўзаць, мы павінны прыняць больш глыбокі погляд.

У якасці рабочага прыкладу, каб даведацца ваша прыкладанне. Пастаўце галачку для канстанты DEBUG ў драйверы базы дадзеных пласта / рамцы абстракцыі базы дадзеных вашага прыкладання, а затым вы можаце пачаць аўдыт, дазваляючы выпадак профілю і вывад выніку з var_dump / print_r. Зараз вы зможаце праглядаць і профіль старонак вашага сайта з лёгкасцю!

Цалкам Рэвізія Вашага прыкладання

Для таго, каб зрабіць поўную рэвізію вашых запытаў, ўключыць вядзенне часопіса. Некаторыя распрацоўшчыкі я працаваў з непакоем, што гэта двухбаковая праблема ў тым, што дазваляе высечку нязначна ўплывае на прадукцыйнасць, і таму статыстыка вам запіс будзе некалькі ніжэй, чым у рэчаіснасці. Хоць гэта праўда, многія тэсты паказваюць, што гэта не занадта вялікая розніца.

Каб уключыць вядзенне часопіса ў MySQL версіі 5.1.6, вы можаце выкарыстоўваць глабальныя log_slow_queries і можа паказаць файл з slow_query_log_file глабальным. Гэта можа быць зроблена падчас выканання запыту, як так:

Вы можаце ўсталяваць гэта пастаянна ў /etc/my.cnf або my.ini файл канфігурацыі для вашага сервера.

Пасля ўнясення гэтых зменаў неабходна перазапусціць сервер MySQL, напрыклад, MySQL service mysql restart Linux.

У новай MySQL 5.6.1, log_slow_queries састарэла і slow_query_log выкарыстоўваецца замест гэтага. Ўключэнне TABLE, як тып выхаду дазваляе значна прыемней вопыт адладкі і можа быць зроблена наступным чынам у MySQL 5.6.1 і пазнейшыя версіі:

long_query_time вызначае колькасць секунд павольны запыт класіфікуецца як. Па змаўчанні 10, а мінімальная 0. Можа прымаць значэнне мілісекунды, паказаўшы паплавок; тут я паставіў яго на 1 секунду. Такім чынам, любы запыт займае больш часу, чым на 1 секунду будзе атрымаць ўваход у выхадны фармат TABLE.

Гэта будзе ўвайсці ў mysql.slow_log і mysql.general_log табліц у MySQL.

Каб адключыць вядзенне часопіса, усталюйце log_output ў NONE.

log_queries_not_using_indexes з'яўляецца карысным булева, якія пры ўключэнні ў спалучэнні з лог павольных запытаў, азначае, што толькі тыя запыты, якія, як чакаецца, каб атрымаць усе радкі запісваюцца.

Гэты варыянт не заўсёды азначае, што не выкарыстоўваецца індэкс. Напрыклад, калі запыт выкарыстоўвае поўны прагляд індэкса, гэта будзе ўваход, паколькі індэкс не будзе абмяжоўваць колькасць радкоў.

Уваход у сістэму вытворчасці?

Ўключэнне вядзення часопіса на вытворчай пляцоўцы з трафікам амаль заўсёды павінна быць зроблена на працягу кароткага перыяду часу, у той час як маніторынг нагрузкі, каб забяспечыць гэта не ўплывае на абслугоўванне. Калі вы знаходзіцеся пад вялікай нагрузкай і неабходна тэрміновае выпраўленне, пачніце з вырашэння праблемы ў камандным радку з SHOW PROCESSLIST або з дапамогай табліцы information_schema.PROCESSLIST непасрэдна, напрыклад, SELECT * from information_schema.PROCESSLIST;.

Уваход на ўсе запыты ў вытворчасці можа сказаць вам шмат, і гэта добрая практыка для даследчых мэт, калі вы аўдыт праекта, але пакінуць яго працаваць на працягу некалькіх дзён запар, часта не даюць вам больш карысных дадзеных, чым у большасці 48 гадзін будзе рабіць ( у сярэднім, па меншай меры захапіць пікавыя часы выкарыстання, каб мець добры погляд на запыты і атрымаць некаторыя ідэі частоты).

Заўвага: калі вы запусцілі сайт, які адчувае скокі напругі ад пікавага трафіку, а затым перыяды не так шмат на ўсіх (напрыклад, вэб-сайт спартыўнага падчас ўключэння і выключэнні сезону), лагічна з тым, як вы глядзіце на лесапавале. Не думайце, што сайт працуе хутка. Выканайце праверку і самае галоўнае наладзіць некаторыя графікаў.

Уваход і Percona ў пт-запыт-дайджэст

Percona мае шмат інструментаў у камплекце з ім, і pt-query-digest гэта інструмент каманднага радка для аналізу часопісаў запытаў, у PROCESSLIST або tcpdumps.

Вы можаце выкарыстоўваць pt-query-digest наступных спосабаў:

Прааналізаваць *.log файл (выведзены з вашага павольнага пратакалявання запытаў, напрыклад):

Справаздачу аб павольных запытах ад host1 ў рэжыме рэальнага часу (вельмі карысна!):

Выкарыстоўвайце ТСРйитр, каб паведаміць самыя павольныя запыты з дадзеных пратаколу MySQL:

Нарэшце, мы можам захаваць павольныя дадзеныя запыту ад аднаго хаста да іншага для наступнага прагляду. Тут мы эканомім запыт пераварваць для slow.log да host2:

Каб даведацца, як цалкам выкарыстоўваць інструмент pt-query-digest Percona, прачытайце старонку кіраўніцтва.

Графічны MySQL і прадукцыйнасць сервера

InnoDB Row Operations

Гэты графік InnoDB аперацый Row паказвае аперацыі радкоў Ьшо маюць выконваюцца: абнаўлення, чытае, выдаляе і ўстаўляе.

Гэта вялікая тэма, на самай справе, і я проста яго закрануць досыць у гэтым кіраўніцтве, каб вы пачалі з маніторынгу MySQL. Важна адзначыць, у цэлым, аднак, што маніторынг ўсіх сэрвісаў вашага сайта ідэальна падыходзіць, каб сапраўды ведаць, што ваша прадукцыйнасць і звычаі.

Для дасягнення гэтай мэты я рэкамендую налады рашэння RRDTool асновы, такія як Cacti з канфігурацыяй MySQL. Атрымаць шаблон для кактуса з хлопцаў у Percona.

Пасля таго, як вы атрымалі Кактусы ўстаноўкі і могуць пачаць аналізаваць ваша прыкладанне, дазваляюць некаторы час, каб прайсці так, што графікі могуць назапашвацца. Праз некалькі дзён вы пачнеце бачыць днём і ноччу рытмы вашага трафіку і паглядзець, як заняты, сэрвэр не сапраўды атрымаць.

Калі вы шукаеце аўтаматычныя абвесткі і трыгера, глядзіце ў наладзе Monit, з адкрытым зыходным кодам папераджальнага манітора для сістэм Unix. З Monit вы можаце стварыць правілы для сервера і пераканайцеся, што вы папярэджаны, калі нагрузка ўзрастае, так што вы можаце злавіць яго ў той час як гэта адбываецца.

Павольнае часопіс запытаў

Logging ўсе павольныя запыты, якія займаюць больш, чым другі, каб скончыць можа сказаць нам нешта, але і ведаць, якія запыты выконваюцца ў сотні разоў не менш важна. Нават калі гэтыя запыты не хапае для выканання, накладныя выдаткі высокіх запытаў па-ранейшаму бярэ свой на сэрвэры.

Вось чаму заставацца вакол, калі вы абнаўляеце нешта і пакласці яго ў прамым эфіры самае важнае час для любой новай працы з базамі дадзеных і змен. У нас заўсёды ёсць палітыка на маіх камандах ніколі не сінхранізаваць новыя змены базы дадзеных функцыі пасля асяроддзя на жывы праект. Гэта павінна быць зроблена ў пачатку тыдня, у апошні аўторак, так што ўсе каманды могуць кантраляваць і аказваць падтрымку адпаведным чынам.

Перад тым, як жыць з новымі запытамі, вы павінны тэст з дапамогай інструмента нагрузачнага тэставання, такіх як ab. Пры запуску тэсту вы павінны быць прагляд SHOW PROCESSLIST, а таксама дазваляюць пратакаляванне і ажыццяўляць маніторынг з сістэмнымі інструментамі, як top, free і IOSTAT. Гэта вельмі важны крок, перш чым пакласці любы новы запыт у жывую прадукцыю. Але гэта не выпрабаванне на 100%, таму што кіслата жывы трафік можа паводзіць сябе зусім па-іншаму да вылічаным эталонам.

Для тэсту з ab, пераканайцеся, што вы ўсталявалі пакет, напрыклад.:

Цяпер вы можаце пачаць тэставанне прыкладання, напрыклад:

-K азначае падтрыманне keep-alive, а -c 350 з'яўляецца колькасцю адначасовых злучэнняў, гэта значыць колькасць людзей / кліентаў, якія трапілі ў сайце адразу. Нарэшце -n 20000 з'яўляецца колькасць запытаў, якія будуць унесены ў my-domain.com.

Такім чынам, выканаўшы каманду вышэй, вы будзеце ўдараць http://my-domain.com/ 350 адначасовых злучэнняў да 20000 запытаў не будуць выкананыя, і гэта будзе зроблена з дапамогай захаваць жывы загаловак.

Пасля завяршэння працэсу 20,000 запытаў, вы будзеце атрымліваць зваротную сувязь па статыстыцы. Гэта пакажа вам, наколькі добра сайт выконваецца пад напругай вы паклалі яго, выкарыстоўваючы параметры вышэй. Гэта добры спосаб даведацца, у аўтаматызаваным сэнсе, калі ваш запыт не змянілася нічога.

Бенчмаркетынгу Гарачыя супраць халоднай

Запыт колькасці і нагрузкі на сервер мае вялікі ўплыў на прадукцыйнасць і час запыту могуць быць закрануты ў сувязі з гэтым. Ва ўсе варта ўключыць часопіс павольных запытаў, каб злавіць гэта ў вытворчасці, і, як правіла, для развіцця вы павінны гарантаваць, што ўсе запыты выконваюцца ў долях мілісекунды (0.0xx або хутчэй) на халастым сэрвэры.

Рэалізацыя Memcache будзе мець вялікі ўплыў на вашых патрабаваннях нагрузкі і будзе выкарыстоўвацца, каб сур'ёзна разгрузіць рэсурсы, якія выкарыстоўваліся да апрацоўкі запытаў. Пераканайцеся, што вы Memcached эфектыўныя і тэст з дапамогай Memcached прыкладання з гарачай кэш (прадусталяваным значэннямі) у параўнанні з халодным.

Для таго, каб пазбегнуць выходзячы ў вытворчасць з пустым кэшам, папярэдне Загрузнік сцэнарам з'яўляецца добрым спосаб забеспячэння кэша будзе прачытаны, і вы не атрымаеце велізарнае колькасць запытаў ўсё бліжэйшы адразу пры выхадзе з прастою з-за адмовы празмернай магутнасці.

Фіксацыя павольных запытаў

Так Уключыўшы вядзенне часопіса, зараз вы знайшлі некалькі павольных запытаў у вашым дадатку. Давайце пяройдзем да іх ліквідацыі! Для мэт прыкладу, я буду дэманстраваць розныя агульныя праблемы, вы сутыкнецеся і логіку, каб выправіць іх.

Калі вы не знайшлі якіх-небудзь павольных запытаў яшчэ, то, магчыма, праверыць, якія параметры дзе для long_query_time, калі вы выкарыстоўваеце метад вядзення часопіса запытаў. У адваротным выпадку, праверыўшы ўсе запыты з прафілявання (set profiling = 1), складзіце спіс запытаў, якія прымаюць больш, чым долі мілісекунды, каб завяршыць (0.000x секунд) і давайце пачнем з іх.

агульныя праблемы

Вось шэсць агульных праблем, я сутыкнуцца пры аптымізацыі запытаў MySQL:

1. ORDER BY з дапамогай FileSort.

Як пазбегнуць FileSort на гэта немагчыма з ORDER BY name. Незалежна ад таго, якія перастаноўкі індэксаў вы карыстаецеся, тым лепш вы атрымаеце Using where; Using Filesort ў вашай Extra калонцы. Для аптымізацыі гэтага, захавайце вынік у Memcache, або зрабіць заказ ў лагічным узроўні прыкладання.

2. З дапамогай ORDER BY на WHERE і LEFT JOIN

ORDER BY мае значныя страты па запытам. Напрыклад, наступнае з'яўляецца адным з асноўных LEFT JOIN з табліцы products і categories табліцы з дапамогай цэлага ID. Пры замове выдаляецца, так гэта filesorting.

Калі яго можна пазбегнуць, старайцеся не выкарыстоўваць ORDER BY. Калі гэта абсалютна неабходна выкарыстоўваць, заказ толькі на ўказальным ключы.

3. Order By на калонцы Тэмп

Толькі не рабіце гэтага. Калі вы маючы патрэбу агрэгаваць вынікі, зрабіць гэта ў вашай логіцы прыкладання; ня робіць фільтрацыю або ўпарадкаванне часовай табліцы ўнутры MySQL. Гэта збіраецца быць вельмі рэсурсаёмістым.

4. Ня выкарыстоўваючы FULLTEXT індэкс

Выкарыстанне LIKE запыту на сённяшні дзень з'яўляецца самым павольным спосаб выканання паўнатэкставага матч вашых дадзеных. Рэалізацыя паўнатэкставага пошуку і скарыстацца перавагамі гэтай бліскучай асаблівасці MySQL, як так:

5. Выбар велізарнай колькасці радкоў без неабходнасці

Забыўшыся LIMIT на запыт можа істотна змяніць час пошуку на вялікіх набораў дадзеных (больш за мільён радкоў).

6. Празмернае далучэнне замест таго, каб проста зрабіць зводную табліцу або прадстаўленне

Калі ён атрымлівае да трох ці чатырох узроўняў LEFT JOIN, вы павінны спытаць сябе: "Ці магу я рабіць гэта правільна» Калі ў вас ёсць разумны аргумент, чаму гэты запыт павінен быць такім, напрыклад, яна з'яўляецца толькі ў акне адміністратара ў краінах з нізкім попыт або ў выкарыстанні большага статыстычнай пункту гледжання, якія могуць быць у кэшы, а затым працягнуць. Але калі вы маючы патрэбу атрымаць доступ да дадзеных, часта з вялікай колькасцю злучэнняў, вы павінны глядзець на тое, як композитинга калоны разам у новую табліцу, можа быць больш карысным, ці ствараючы выгляд.

высновы

Мы абмеркавалі аснову аптымізацыі і інструменты, якія мы маем у нашым распараджэнні, каб выканаць працу. Мы павінны праводзіць аўдыт з прафілявання, а таксама выкарыстоўваць інструмент pt-query-digest і EXPLAIN першым, каб убачыць, што адбываецца на самай справе, а затым адтуль мы можам канструяваць лепш.

Мы таксама разгледзелі некалькі прыкладаў выпадкаў і агульныя памылкі, вы можаце сутыкнуцца пры працы з MySQL. Выкарыстанне індэкса намякаючы мы можам забяспечыць MySQL выбірае правільныя індэксы для працы і не заблытацца, асабліва калі ёсць некалькі запытаў на адной і той жа табліцы. Каб працягнуць чытанне па гэтай тэме, праверыць праект Percona і блог MySQL Performance для атрымання дадатковай інфармацыі.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.