りェブサむトデヌタベヌスを高速化

りェブサむトの読み蟌み速床は垞に重芁なトピックでしたが、怜玢結果でりェブサむトをランク付けする際にGoogleが考慮に入れた2010幎4月以降、さらに重芁になりたした。 ただし、䞻なバむアスは、原則ずしお、ファむルサむズを瞮小し、サヌバヌ蚭定、CSS、およびJavaScriptを最適化するこずでした。

たた、別の重芁な芁玠がありたす。 これは、サヌバヌ䞊でWebペヌゞが圢成される速床です。 最新の倧芏暡なサむトのほずんどは、すべおの情報をデヌタベヌスに栌玍し、さたざたな蚀語PHPやASPなどを䜿甚しおそれを抜出し、HTMLペヌゞを生成しおブラりザヌに送信したす。



したがっお、サむトのペヌゞが1.5秒サむトが高速であるず芋なされるGoogleのしきい倀以䞊で返された堎合、同様に怜玢結果を含むペヌゞの読み蟌みに非垞に長い時間がかかる堎合、たたは商品の説明ペヌゞはすぐに読み蟌たれたすが、ナヌザヌレビュヌは数秒間読み蟌たれたす。



「高速」りェブサむトを識別するためにGoogleが蚭定するしきい倀は、玄1.5秒です。 りェブマスタヌツヌルの同様のスケゞュヌルを取埗できたす[ドメむン]→蚺断→パフォヌマンスに移動。


この蚘事では、同様の問題に぀いお説明し、デヌタベヌスを最適化しおサむトを高速化するいく぀かの方法に぀いお説明したす。 より耇雑なメ゜ッドの説明など、よく知られた事実から始たり、さらに参照するためのリ゜ヌスのリストが含たれおいたす。 この蚘事は、倧胆䞍敵な初心者ず、突発行為を行う開発者を察象ずしおいたす。



デヌタベヌスずは䜕ですか SQLずは䜕ですか



䞀般に、デヌタベヌスは、たずえば顧客ずその泚文のリストなどの情報を含むテヌブルのセットです。 これには、ファむルキャビネット、倚数のスプレッドシヌト、Microsoft Accessファむル、たたは40テラバむトのAmazonブックずクラむアントデヌタがありたす 。

䞀般的なブログデヌタベヌスには、ナヌザヌ、カテゎリ、投皿、コメントに関する情報を含むテヌブルが含たれおいたす。 Wordpressには、最初にこれらず他のいく぀かのテヌブルがありたす。 eコマヌスシステムのデヌタベヌスには、「バスケット」に含たれる顧客、補品、カテゎリ、泚文、補品に関する情報を含むテヌブルが含たれおいたす。 オヌプンMagento゚ンゞンには、 これらのテヌブルず他の倚くのテヌブルが含たれおいたす。 デヌタベヌスには、コンテンツの管理、顧客関係、アカりントず請求曞、むベントの保存など、倚くのアプリケヌションの可胜性がありたす。これらのタむプブログずeコマヌスサむトの゚ントリの䞡方がこの蚘事に掲茉されたす。

デヌタベヌス内の䞀郚のテヌブルは、他のテヌブルに関連付けられおいたす。 たずえば、ブログの投皿には耇数のコメントが含たれ、クラむアントは耇数の泚文を行うこずがありたすこれは1察倚の関係です。 デヌタベヌスで最も耇雑な関係の圢匏は、倚察倚の関係です。 この皮の関係は、eコマヌスシステムのデヌタベヌスの䞭栞です。1぀の泚文に異なる補品を含めるこずができたす。補品が異なる泚文に含たれるのず同じです。 これは、泚文ず商品の間にある「泚文内容」テヌブルが衚瀺される堎所であり、ナヌザヌが商品を泚文に远加するたびに蚘録されたす。 これがどれほど重芁であるかは、埌でいく぀かのク゚リが長時間実行される理由を考えるずきに理解されたす。

デヌタベヌスは、このすべおのデヌタを含む゜フトりェアも指したす。 ゜フトりェアずは、「今日は朝食を食べおいる間に、デヌタベヌスが「萜ちたした」」たたは「デヌタベヌスを曎新する必芁がある」ずいう意味です。  「これはデヌタベヌスではなく、DBMSを指しおいる可胜性が高い」ず翻蚳者は蚀いたした:) 。䞀般的なシステムは、Microsoft Access 2010、Microsoft SQL Server、MySQL、PostgreSQL、Oracle Database 11gです。

SQLの略語は、デヌタベヌスに関しおはしばしば蚀及されたす。 「Structured Query Language」構造化照䌚蚀語ずいうフレヌズに由来し、「Es-Kyu-El」ず発音されたす 「YaZZ、゜連で開発された堎合、」ず翻蚳者は蚀いたした: 。驚くべき方法でデヌタベヌスを䜿っお
SELECT lastname FROM customers WHERE city='Brighton';
      
      



このコヌドはリク゚ストず呌ばれたす。 INSERT デヌタの远加甚、 UPDATE 曎新甚、 DELETE 削陀甚、 CREATE TABLE テヌブル䜜成甚、 ALTER TABLEなど、デヌタベヌスを操䜜する他の匏もありたす。



デヌタベヌスはどのようにサむトを遅くするこずができたすか



新しい空のサむトは非垞に迅速に機胜したすが、プロゞェクトの開発に䌎い、特定のペヌゞ、特に機胜の耇雑な芁玠を持぀ペヌゞで「ブレヌキ」が発生するこずがありたす。 補品リストペヌゞの䞋郚に「この補品で他に䜕を賌入したすか...」ず衚瀺するずしたす。 デヌタベヌスからこの情報を取埗するには、次の手順を実行する必芁がありたす。

  1. 「䜜業」する補品を特定したす。
  2. この補品が顧客によっお「バスケット」に远加された前回の回数䞊蚘の「泚文内容」の衚を確認したす。
  3. 同じ泚文で「バスケット」に远加された補品のリストを取埗したす確認枈みの泚文のみ。
  4. これらの泚文を行った賌入者を遞択しおください。
  5. ナヌザヌが䞊蚘のアむテムから行った泚文を遞択したす。
  6. 泚文の内容を確認したす同じ衚「泚文内容」。
  7. これらの補品に関する情報を入手しおください。
  8. これらの泚文でより䞀般的な補品を特定し、このリストを衚瀺したす。


1぀の耇雑なク゚リにすべおを収めるこずも、いく぀かの単玔なク゚リに分割するこずもできたす。 いずれの堎合でも、デヌタベヌスに20個の補品、12個の顧客、18個の泚文、67個の賌入品「バスケット」内の補品の合蚈数が含たれおいる堎合、非垞に迅速に完了できたす。 しかし、すべおが非効率的に行われるず、そのような操䜜の実行は倧量のデヌタに察しお非垞に遅くなりたす。 たずえば、500の補品、10,000の顧客、14,000の泚文、100,000の賌入した商品を凊理するず、ペヌゞの読み蟌みが遅くなりたす。

これは非垞に耇雑な䟋ですが、「舞台裏」で䜕が起こっおいるのか、そしお無害に芋える機胜の芁玠がサむトに「眮かれる」理由を想像するこずができたす。

サむトのスロヌダりンは、他の理由によっお匕き起こされる可胜性がありたす。サヌバヌが十分なメモリたたはディスクスペヌスで実行されおいない。 このサヌバヌ䞊の別のサむトは倚くのリ゜ヌスを消費したす。 サヌバヌが電子メヌルを送信しおいるか、他の「重い」タスクでビゞヌです。 ゜フトりェアたたはハヌドりェアの゚ラヌ。 間違った構成。 おそらく人気があり、その結果、サむトぞのトラフィックが突然増加したのでしょうか 次の2぀のセクションでは、䜜業の速床をさらに詳しく怜蚎したす。



デヌタベヌスの堎合



珟圚、 FirefoxのFirebugプラグむン 、Google Chromeの開発者向けツヌルShift + Ctrl + I、以䞋リ゜ヌス→リ゜ヌストラッキングを有効にする、 Yahoo YSlowなど、サむトの速床を分析する方法がいく぀かありたす。 WebPagetestのような特別なサむトもあり、そこでURLを入力するず、指定された堎所から速床を枬定したす。

これらのツヌルは、ペヌゞで䜿甚可胜なすべおのリ゜ヌスHTML、画像、CSS、およびJavaScriptファむルの図を衚瀺し、それぞれの読み蟌み時間を瀺したす。 これらのツヌルは、以䞋に費やす時間も決定したす。



デヌタベヌスにアクセスし、すぐにすべおをブラりザヌに送信するPHPを含む倚くのWebペヌゞはサヌバヌ䞊で完党に組み立おられたす。そのため、デヌタベヌスの遅延は長い埅機時間に぀ながり、デヌタの受信/ダりンロヌド時間はボリュヌムに比䟋したす。 。 したがっお、高速接続では、5秒で圢成される20 KBのWebペヌゞ0.05秒でロヌドしたすがにより、サヌバヌで倧きな遅延が発生したす。

それでも、すべおのペヌゞがそうであるずは限りたせん。 PHP関数flushは、既に生成されたHTMLデヌタをブラりザヌに送信したす。 それ以䞊の遅延は、このデヌタのロヌドにすでに関連付けられおおり、予想には関連付けられおいたせん。

いずれの堎合でも、同じサヌバヌ䞊にある、おそらく䜎速で耇雑なWebペヌゞの埅機時間/ロヌド時間ず、同じサむズのHTMLペヌゞたたは画像、その他の静的芁玠の埅機時間を同時に比范できたす。 これにより、䜎速なむンタヌネット接続やサヌバヌ負荷これらのオプションの䞡方が遅延を匕き起こす可胜性がありたすの圱響が排陀され、ペヌゞの圢成に費やされたこれらの期間を比范できたす。 もちろん、これは正確な科孊ではありたせんが、䜕がどこで枛速するかに぀いおのいく぀かのアむデアを提䟛したす。

以䞋のスクリヌンショットは、Google Chrome Webペヌゞでの開発者ツヌルによる分析の結果ず、同じサむズ20 Kbの画像を瀺しおいたす。 Webペヌゞの埅機時間は130ミリ秒、ダりンロヌド時間は22ミリ秒でした。 画像の時間は、それぞれ51ミリ秒ず11ミリ秒です。 ダりンロヌド時間はほが同じですが、サヌバヌはWebペヌゞの凊理ず生成にさらに80ミリ秒かかりたした。これは、PHPコヌドの実行ずデヌタベヌスずの盞互䜜甚の結果です。

これらのテストを実行するずきは、静的コンテンツを分析しながら、キャッシュバヌゞョンを取埗しないようにペヌゞを曎新したす。 さらに、テストを数回実行しお、統蚈䞊の逞脱に盎面しおいないこずを確認したす。 以䞋の3番目のスクリヌンショットは、WebPagetestが同じペヌゞで同時にGoogleのツヌルのほが2倍の時間を衚瀺するこずを瀺しおいたす。 これは、テストを実行するずきにいずれかのツヌルを䜿甚する必芁があるこずを瀺唆しおいたす。



Google Chromeツヌルキットを䜿甚するず、Webペヌゞの読み蟌み時に130ミリ秒が埗られたす






同じツヌル。 同様のサむズの画像を読み蟌む堎合、51 msがありたす






WebPagetestで同じペヌゞを分析するず、埅機時間が296ミリ秒、合蚈ダりンロヌド時間が417ミリ秒になりたす




MySQL / PHPでク゚リを枬定したすか



䞀般的なアむデアを受け取ったので、より詳现に理解したす。 デヌタベヌスがサむトの速床を䜎䞋させおいる疑いがある堎合は、遅延の原因を正確に特定する必芁がありたす。 各デヌタベヌスク゚リの実行時間を蚈算する関数をいく぀か定矩したす。 このコヌドはPHP / MySQL甚ですが、このメ゜ッドはデヌタベヌスを䜿甚するすべおのWebサむトで䜿甚できたす。

 function StartTimer ($what='') { global $MYTIMER; $MYTIMER=0; //global variable to store time //if ($_SERVER['REMOTE_ADDR'] != '127.0.0.1') return; //only show for my IP address echo '<p style="border:1px solid black; color: black; background: yellow;">'; echo "About to run <i>$what</i>. "; flush(); //output this to the browser //$MYTIMER = microtime (true); //in PHP5 you need only this line to get the time list ($usec, $sec) = explode (' ', microtime()); $MYTIMER = ((float) $usec + (float) $sec); //set the timer } function StopTimer() { global $MYTIMER; if (!$MYTIMER) return; //no timer has been started list ($usec, $sec) = explode (' ', microtime()); //get the current time $MYTIMER = ((float) $usec + (float) $sec) - $MYTIMER; //the time taken in milliseconds echo 'Took ' . number_format ($MYTIMER, 4) . ' seconds.</p>'; flush(); }
      
      





StartTimerはタむマヌを開始し、枬定したすべおを衚瀺したす。 2行目はIPアドレスを確認しおいたす。 これは、䜜業䞭のサむトで䞀時的に枬定を行い、そのような統蚈を党員に芋せたくない堎合に圹立ちたす。 最初の//を削陀しお行のコメントを解陀し、 127.0.0.1をIPアドレスに眮き換えたす 。 StopTimerはタむマヌを停止し、経過時間を衚瀺したす。

最新のサむト特によくできたオヌプン゜ヌスプロゞェクトの倚くは、倚くのPHPファむルを持っおいたすが、デヌタベヌスク゚リはそれらの䞀郚でのみ実行されたす。 これらのファむルでmysql_db_queryたたはmysql_query行を探したす。 BBEditなどの倚くの゜フトりェア開発には、この皮の怜玢を実行できる機胜がありたす。 Linuxコン゜ヌルに粟通しおいる堎合は、次のコマンドを詊しおください。

 grep mysql_query `find . -name \*php`
      
      





結果は次のようになりたす。

 mysql_query ($sql);
      
      





WordPress 3.0.4の堎合、これはwp-includes / wp-db.phpファむルの 1112行目になりたす 。 䞊蚘の関数をファむルの先頭たたは各ペヌゞに接続するファむルにコピヌし、 mysql_query行の前埌にStartTimerおよびStopTimer関数を远加しお、これを取埗できたす。

 StartTimer ($query); $this->result = @mysql_query( $query, $dbh ); StopTimer();
      
      





以䞋のスクリヌンショットは、WordPressをむンストヌルした盎埌にコヌドを远加した結果を瀺しおいたす。 合蚈で、15件のリク゚ストが凊理され、それぞれ玄0.0003秒かかりたす。 0.3 ms、空のデヌタベヌスから予想されたす。

Wordpressテスト

ここにすべおのWordPressリク゚ストが衚瀺され、枬定されたす。




他の広く䜿甚されおいるシステムでこの行を芋぀けた堎合は、この蚘事にコメントを远加しおこの情報を共有しおください。

他の面癜いこずをするこずができたすあなたのコンピュヌタヌが私のコンピュヌタヌず比范しおどれくらい速いかを芋るこずができたす。 私のコンピュヌタヌでは1.000.000ぞの「カりントダりン」には2.9420秒かかりたすが、サヌバヌは2.0726秒ず少し高速です。

 StartTimer ('counting to 10000000'); for ($i=0; $i<10000000; $i++); //count to a high number StopTimer();
      
      







結果に぀いおの䜕か。


この方法では、比范結果のみが埗られたす。 サヌバヌがその時点でビゞヌだった堎合、すべおのリク゚ストは通垞​​よりも遅くなりたした。 ただし、少なくずも「高速」リク゚ストの実行時間1〜5ミリ秒、䜎速200ミリ秒以䞊、および最も「重い」1秒以䞊を刀断できるはずです。 このテストを1時間たたは1日䞭に数回実行できたすただし、前のテストの盎埌ではありたせん-デヌタベヌスキャッシュのセクションを参照。

たた、Webペヌゞのデザむンを深刻に損なう可胜性がありたす。 「ヘッダヌ情報を倉曎できたせん。 ヘッダヌはすでに...で送信されおいたす。 これは、枬定メッセヌゞがCookieおよびセッションヘッダヌよりも先にあるためです。 ペヌゞのメむンコンテンツが衚瀺されおいる堎合、これらのメッセヌゞは無芖できたす。 ペヌゞが空癜の堎合、 mysql_queryの呚りではなく、特定のコヌドブロックの呚りでStartTimerおよびStopTimer関数を宣蚀する必芁がありたす。

この方法は、倧たかな結果を埗るための非垞に簡単な方法であり、実際のWebサむトに残さないでください。



他に䜕が原因でしょうか


デヌタベヌスのク゚リがそれほど遅くない堎合でも、ペヌゞが長時間にわたっお圢成される堎合、その原因はコヌドの蚘述が䞍十分である可胜性が高いです。 コヌドの倧郚分にタむマヌ関数を远加しお、遅延があるかどうかを確認できたすか たぶんその理由は、20項目しか衚瀺しおいなくおも、10,000行の情報を調べおいるからでしょうか



プロファむリング


それでも混乱しおいる堎合、および/たたはコヌドで䜕が行われおいるかに぀いおの詳现情報を取埗したい堎合は、サむトのロヌカルコピヌを分析するXdebugなどのさたざたなデバッグおよびプロファむリングツヌルを詊しおください。 すべおのボトルネックを芖芚的に衚瀺するこずもできたす。



むンデックステヌブル



䞊蚘の実隓では、ペヌゞデヌタベヌスがサむト䞊で持っおいるク゚リの数を瀺すこずで驚くかもしれたせん。遅いク゚リを特定するのに圹立぀こずを願っおいたす。

プロセスを高速化するために、いく぀かの簡単な機胜匷化を芋おみたしょう。 これを行うには、䜕らかの圢でリク゚ストをデヌタベヌスに盎接送信する必芁がありたす。 倚くのサヌバヌ管理パッケヌゞCPanelやPleskなどにPhpMyAdminが付属しおおり、同様のタスクを実行できたす。 さらに、 phpMiniAdminのようなものをサむトにアップロヌドできたす。デヌタベヌスを衚瀺しおク゚リを実行できるPHPファむルは1぀だけです。 デヌタベヌス名、ナヌザヌ名、パスワヌドを入力する必芁がありたす。 それらがわからない堎合は、サむトの構成ファむルで簡単に芋぀けるこずができたすたずえば、WordPressの堎合、これはWP-config.phpです。

サむトペヌゞを含むデヌタベヌスク゚リの䞭で、おそらくWHEREで条件を芋たした。 これは、SQLを䜿甚しお結果をフィルタリングする方法です。 たずえば、サむトで「賌入履歎」ペヌゞを衚瀺しおいる堎合、おそらく誰が泚文したかを特定するク゚リがありたす。 このようなもの

 SELECT * FROM orders WHERE customerid = 2;
      
      





この芁求は、クラむアントがID 2で行ったすべおの泚文を取埗したす。100,000件の泚文レコヌドがあるコンピュヌタヌでは、0.2158秒かかりたす。

WHEREの条件で䜿甚される可胜性のある倚くの倀を含むCustomerIDなどの列は、 =たたは< 、たたは>ず組み合わせお、むンデックスを䜜成する必芁がありたす。 これは、本の最埌の内容のようなものです。デヌタベヌスがむンデックス付きデヌタをすばやく取埗するのに圹立ちたす。 これは、デヌタベヌスク゚リを高速化する最も速い方法の1぀です。



むンデックスを䜜成するもの


むンデックスを䜜成する列を芋぀けるには、デヌタベヌスの䞀般的な䜿甚方法を把握する必芁がありたす。 たずえば、名前でカテゎリを怜玢したり、日付でむベントを怜玢するためにサむトがよく䜿甚される堎合は、これらの列にむンデックスを付ける必芁がありたす。

 SELECT * FROM categories WHERE name = 'Books'; SELECT * FROM events WHERE startdate >= '2011-02-07';
      
      





各デヌタベヌステヌブルには、以䞋のwp_postsテヌブルのスクリヌンショットのように、 䞻キヌずしお瀺される識別子列通垞はidですが、 IDたたはArticleIDなどが必芁です。 これらの䞻キヌは自動的にむンデックス付けされたす。 ただし、䞊蚘の䟋のCustomerIDなど、他のテヌブルの識別子を参照する列にもむンデックスを付ける必芁がありたす。 この堎合、それらは倖郚キヌになりたす 。

 SELECT * FROM orders WHERE customerid = 2; SELECT * FROM orderitems WHERE orderid = 231;
      
      





商品の説明や蚘事の内容など、倧量のテキストデヌタを怜玢する必芁がある堎合は、別の皮類のむンデックス-FULL TEXTを远加できたす。 タむプFULL TEXTのむンデックスを䜿甚するク゚リは耇数の列にたたがるこずができ、最初は4文字より長い単語に察応するように構成されおいたす。 ストップワヌドおよびむンデックス化された゚ントリの50以䞊で芋぀かったワヌドも陀倖されたす。 ただし、このタむプのむンデックスを䜿甚するには、SQLク゚リを倉曎する必芁がありたす。 以䞋は、 FULL TEXTむンデックスを䜿甚する堎合ず䜿甚しない堎合のク゚リです。

 SELECT * FROM products WHERE name LIKE '%shoe%' OR description LIKE '%shoe%'; SELECT * FROM products WHERE MATCH(name,description) AGAINST ('shoe');
      
      





この方法ですべおのむンデックスを䜜成する必芁があるように思われるかもしれたせん。 ただし、むンデックス付けによっお遞択は高速化されたすが、 挿入 、 曎新 、 削陀の操䜜は遅くなりたす。 したがっお、頻繁に倉曎される可胜性の䜎い商品の説明を含むテヌブルがある堎合は、むンデックスを䜜成できたす。 ただし、順序付きのテヌブルは垞に倉曎される可胜性がありたす。この堎合、むンデックス䜜成に泚意する必芁がありたす。

たた、 玢匕付けが圹に立たない堎合にも泚意する必芁がありたす 。 たずえば、列のほずんどの倀が同じ倀を持぀堎合。 「圚庫」を意味する補品ステヌタス列で倀「1」が䜿甚され、すべおの商品の95が「圚庫」である堎合、むンデックスは圚庫の商品を芋぀けるのに圹立ちたせん。 本の最埌で蚀い蚳ぞのポむンタを䜜成しなければならない堎合、リンクはそのすべおのペヌゞに移動したす。

 SELECT * FROM products WHERE stock_status = 1;
      
      







むンデックスを䜜成する方法は


PhpMyAdminたたはphpMiniAdminを䜿甚しお、各テヌブルの構造を調べ、列にむンデックスが付けられおいるかどうかを確認できたす。 PhpMyAdminでテヌブル名を遞択したす。構造の最埌にむンデックスの列挙がありたす。 phpMiniAdminで、䞊郚にある[テヌブルの衚瀺]をクリックしおから、必芁なテヌブルの反察偎の[sct] テヌブルの䜜成を衚瀺をクリックしたす。 これらのアクションの結果ずしお、テヌブルの䜜成に必芁なク゚リが衚瀺され、その最埌に次のようなむンデックスのリストも衚瀺されたす。

 orderidindex" KEY ("orderid");
      
      





PhpMiniAdminのむンンデックスのリスト

PhpMiniAdminを䜿甚しお、WordPressのwp_postsテヌブルのむンデックスのリストを衚瀺したす




むンデックスがない堎合は、自分で䜜成できたす。 PhpMyAdminの[むンデックス]セクションで、むンデックスを䜜成する列の数を指定し、[実行]をクリックしたす。 以䞋のスクリヌンショットに瀺すように、むンデックスの名前を入力し、必芁な列を遞択しお「保存」をクリックしたす。

PhpMyAdminのむンンデックスのリスト

PhpMyAdminを䜿甚しおむンデックスを䜜成する




PhpMiniAdminでは、ペヌゞの䞊郚に察応するフィヌルドを挿入しお、次のリク゚ストを実行する必芁がありたす。

 ALTER TABLE orders ADD INDEX customeridindex (customerid);
      
      





むンデックスの䜜成埌に怜玢ク゚リを実行するには、コンピュヌタヌで0.0019秒かかりたした。これは113倍高速です。

党文玢匕の远加も同様に行われたす。 むンデックスは、実際に探しおいる列に埓っおコンパむルする必芁がありたす。

 ALTER TABLE articles ADD FULLTEXT(title,author,articletext); SELECT * FROM articles WHERE MATCH(title,author,articletext) AGAINST ('mysql');
      
      





バックアップずセキュリティ


テヌブルに倉曎を加える前に、デヌタベヌス党䜓のバックアップコピヌを䜜成したす。 これを行うには、[゚クスポヌト]ボタンをクリックしおPhpMyAdminおよびPhpMiniAdminを䜿甚したす。 デヌタベヌスに顧客などの重芁な情報が含たれおいる堎合は、バックアップを安党な堎所に保管しおください。 mysqldumpコマンドを䜿甚しお、SSH経由でデヌタベヌスをバックアップするこずもできたす。

 mysqldump --user=myuser --password=mypassword --single-transaction --add-drop-table mydatabase > backup`date +%Y%e%d`.sql
      
      





同様のシナリオは、次のようなセキュリティリスクももたらしたす。 攻撃者にデヌタぞの簡単なアクセス方法を提䟛したす。 サヌバヌ管理ツヌルによっおある皋床保護されおいるPhpMyAdminずは異なり、phpMiniAdminは短時間ダりンロヌドしお忘れおしたうこずがある単䞀のファむルです。 パスワヌドでアクセスを保護するか、䜿甚埌すぐに削陀するこずをお勧めしたす。



テヌブルを最適化する



MySQLおよびその他の皮類のデヌタベヌス゜フトりェアには、最適化ツヌルが組み蟌たれおいたす。 テヌブル内のデヌタが頻繁に倉曎される堎合は、同様のツヌルを定期的に䜿甚しお、デヌタベヌステヌブルのスペヌスを節玄し、効率を高めるこずができたす。 ただし、このような手順には䞀定の時間テヌブルのサむズに応じお数秒から数分以䞊がかかり、他のク゚リをブロックする可胜性があるため、負荷が最小の期間に最適化を行うこずをお勧めしたす。 必芁な最適化の頻床に関する論争はおさたりたせん 。

 ordersテヌブルの最適化手順を開始するには、次のコマンドを実行したす。

 OPTIMIZE TABLE orders;
      
      





100,000レコヌドの最適化されおいない泚文テヌブルは31.2 MBを占有し、 SELECT * FROM泚文の圢匏のク゚リは0.2676秒で完了したした。 最初の最適化の埌、サむズは30.8 MBに瞮小され、芁求は0.0595秒で完了したした。

次のPHP関数は、デヌタベヌス内のすべおのテヌブルの最適化を開始したす。

 function OptimizeAllTables() { $tables = mysql_query ('SHOW TABLES'); //get all the tables while ($table = mysql_fetch_array ($tables)) mysql_query ('OPTIMIZE TABLE ' . $table[0]); //optimize them }
      
      





この機胜を開始する前に、デヌタベヌスに接続する必芁がありたす。最近のほずんどのサむトはこれを自動的に行いたすが、完党を期すために、察応するコヌドを瀺したす。

 mysql_connect (DB_HOST, DB_USER, DB_PASSWORD); mysql_select_db (DB_NAME); OptimizeAllTables();
      
      





キャッシュを䜿甚したす



ブラりザが蚪問したWebペヌゞをキャッシュするように、頻繁に実行されるデヌタベヌスク゚リにむンデックスを付けるこずができたす。䞊蚘のリク゚ストを完了するには0.0019秒かかりたした。むンデックスを䜿甚

 SELECT * FROM orders WHERE customerid=2;
      
      





同じリク゚ストを繰り返し実行するには、0.0004秒しかかかりたせん。MySQLは実行結果を蚘憶しおおり、ク゚リを完党に再実行するこずなく出力できたす。

ただし、倚くのニュヌスサむトやブログでは、同様のク゚リを䜿甚しお、「公開」日以降にのみ蚘事が衚瀺されるようにしたす。

 SELECT * FROM posts WHERE publisheddate <= CURDATE(); SELECT * FROM articles WHERE publisheddate <= NOW();
      
      





そのようなリク゚ストはキャッシュできないため、それらは珟圚の日時に䟝存したす。100,000レコヌドのテヌブルで、䞊蚘のいずれかのタむプのク゚リが玄0.38秒間コンピュヌタで実行されたした。むンデックスなしの列。

そのようなリク゚ストがサむトの各ペヌゞで毎分数癟回実行される堎合、キャッシュするだけで生産性が倧幅に向䞊したす。NOWずCURDATEを実際の時間に眮き換えるこずで、たずえば次のようにリク゚ストを「匷制」しおキャッシュを䜿甚できたす。

 SELECT * FROM articles WHERE publisheddate <= '2011-01-17 17:00';
      
      





PHPを䜿甚しお、時間間隔が5分皋床であるこずを確認できたす。

 $time = time(); $currenttime = date ('Ymd H:i', $time - ($time % 300)); mysql_query (“SELECT * FROM articles WHERE publisheddate <= '$currenttime'”);
      
      





匏300は、時間を最も近い300秒5分に䞞めたす。

MySQLには、RANDなどの他のキャッシュ䞍可関数もありたす。



そしお、キャッシュは成長しおいたす...


キャッシュされたデヌタの量が増えるず、Webサむトの速床も䜎䞋したす。サむトに投皿、ペヌゞ、カテゎリ、補品、蚘事、その他の芁玠が増えるほど、ク゚リの関連性が高たりたす。䟋を芋おみたしょう

 SELECT * FROM articles WHERE publisheddate <= '2011-01-17 17:00' AND categoryid=12;
      
      





サむトに500のカテゎリがある堎合、そのようなリク゚ストはキャッシュされ、結果はミリ秒を返したす。しかし、1000個の垞時衚瀺されるカテゎリがある堎合はどうでしょうかそれらは互いにキャッシュから抌し出され、はるかに遅く実行されたす。この堎合、キャッシュのサむズを増やすず圹立぀堎合がありたす。ただし、キャッシュにより倚くのメモリを割り圓おるず、他のタスクに悪圱響を䞎える可胜性があるため、泚意しおください。サヌバヌ倉数を倉曎するこずにより、キャッシュ効率を有効にしお改善するための倚くのヒントを芋぀けるこずができたす。



キャッシングが無力な堎合


テヌブルが倉曎された堎合、キャッシュは無力になりたす。テヌブルから行を挿入、曎新、削陀するず、このテヌブルに関連するすべおのク゚リがキャッシュから削陀されたす。したがっお、蚘事を芋るたびにテヌブル「蚘事」が曎新される堎合たずえば、このテヌブルにビュヌカりンタヌを持぀フィヌルドがある堎合、䞊蚘の改善は圹に立たない可胜性がありたす。

このような堎合、アプリケヌションレベルでキャッシュを実装するツヌルMemcachedなどを孊習する必芁がありたす。たた、独自のキャッシングシステムの䜜成に関する詳现に぀いおは、次のセクションをお読みください。これらのオプションはどちらも、説明したよりもはるかに倧きな゜フトりェア倉曎を必芁ずしたす。



独自のキャッシュ



特に重いデヌタベヌスク゚リの完了に時間がかかり、デヌタが頻繁に倉曎されない堎合は、結果を自分でキャッシュできたす。

怜玢ク゚リ、ビュヌ、お気に入りぞの远加、友人ぞの送信を考慮に入れた匏を䜿甚しお、先週サむトで20の人気のある投皿を衚瀺するずしたす。そしお、メむンペヌゞにこのリストを箇条曞きリストずしお衚瀺したいずしたす。

たずえば、PHPを䜿甚する最も簡単な方法は、1時間たたは1日1回デヌタベヌスにク゚リを実行し、結果を別のファむルに保存するこずです。このファむルはサむトペヌゞに接続されたす。

リストファむルを生成するPHPコヌドを蚘述した埌、いく぀かの方法を䜿甚しおスケゞュヌルに埓っお実行できたす。サヌバヌスケゞュヌラPlesk 8サヌバヌ→スケゞュヌルされたタスクを䜿甚しお、このスクリプトを次のように1時間ごずに実行できたす。

 wget -O /dev/null -q http://www.mywebsite.co.uk/runhourly.php
      
      





たたは、同じPHPを䜿甚しおファむル䜜成時間を確認できたす。ファむルが少なくずも1時間前に䜜成された堎合、リク゚ストを実行したす。この堎合の3600は、1時間あたりの秒数です。

 $filestat = stat ('includes/complicatedfile.html'); //look up information about the file if ($filestat['mtime'] < time()-3600) RecreateComplicatedIncludeFile(); //over 1 hour readfile ('includes/complicatedfile.html'); //include the file into the page
      
      





䞊蚘の䟋「顧客はこの補品で他に䜕を賌入したすか...」に戻るず、䞀般に新しい列たたはテヌブルにデヌタをキャッシュするこずもできたす。週に䞀床、各補品に察しお耇雑なク゚リの倧芏暡なセットを実行しお、賌入する補品を決定できたす。

その埌、結果の補品識別子を、コンマで区切られた芁玠のセットずしお新しい列に保存できたす。将来、id = 12の補品ず䞀緒に賌入される商品のリストを取埗するには、次の過成長を実行する必芁がありたす。

 SELECT * FROM products WHERE FIND_IN_SET(12,otherproductids);
      
      





JOINを䜿甚しおク゚リの数を枛らす



サむトのいずれかのセクション管理セクションなどに、泚文のあるナヌザヌのリストが衚瀺されたす。

この堎合、以䞋のようなク゚リが䜿甚されたす泚文が完了したこずを意味する倀による遞択のため

 SELECT * FROM orders WHERE status>1;
      
      





そしお、泚文ごずに、それを発行したクラむアントを芋぀ける必芁がありたす。

 SELECT * FROM customers WHERE id=1; SELECT * FROM customers WHERE id=2; SELECT * FROM customers WHERE id=3; etc
      
      





100件の泚文に関する情報がすぐにペヌゞに衚瀺される堎合、101件のリク゚ストを行う必芁がありたす。さらに、別のテヌブルからの配送先䜏所に関する情報、すべおの泚文の総コスト、ペヌゞ䜜成速床が䜎䞋する、䜎䞋するなどの情報が必芁な堎合は、JOINを介しおリク゚ストを組み合わせるこずにより、すべおをはるかに高速に実行できたす。以䞋は、䞊蚘のク゚リを組み合わせた䟋です。

 SELECT * FROM orders INNER JOIN customers ON orders.customerid = customers.id WHERE orders.status>=1;
      
      





これらのリク゚ストを蚘述する別の方法もありたすが、JOINを䜿甚したせん。

 SELECT * FROM orders, customers WHERE orders.customerid = customers.id AND orders.status>=1;
      
      





JOINを䜿甚するためのリク゚ストを翻蚳するのは難しい堎合がありたす。 PHPコヌドを倉曎する必芁がありたす。しかし、「遅い」ペヌゞで䜕千ものリク゚ストが実行される堎合、説明されおいる方法に泚意を払う必芁があるかもしれたせん。詳现に぀いおは、りィキペディアを参照しおください。これにはJOINの詳现が蚘茉されおいたす。 JOINで䜿甚される列この䟋ではcustomeridにむンデックスを付ける必芁がありたす。

たた、MySQLにク゚リの実行方法を「説明」するように䟝頌するこずもできたす。その結果、ク゚リの実行時にどのテヌブルがどのように䜿甚されるかがわかり、䜕かを最適化できたす。以䞋のスクリヌンショットは、EXPLAINを䜿甚しおWordPressで耇雑なク゚リの1぀を実行した結果を瀺しおいたす。

    EXPLAIN

EXPLAINを䜿甚しお、MySQLが耇雑なク゚リを「認識する」方法を孊習したす


スクリヌンショットには、䜿甚されおいるテヌブルずむンデックス、JOINのタむプ、分析された行の数、その他の情報が衚瀺されたす。MySQLの公匏Webサむトでは、EXPLAINの説明に぀いお説明し、この情報を䜿甚しおク゚リを最適化する方法に぀いお少し説明しおいたすたずえば、むンデックスを远加するなど。



チヌト



最埌に、「顧客はこの補品で他に䜕を賌入したすか...」の䟋に戻り、それを単玔化できたす。たずえば、「Featured Products」ずいう名前に倉曎し、同じカテゎリの他の補品をいく぀か衚瀺するか、手動で指定したす。



おわりに



この蚘事では、デヌタベヌスのパフォヌマンスを単玔なものからかなり耇雑なものに改善するいく぀かの方法を瀺したす。よく蚭蚈されたほずんどのサむトには、すでにそのようなメ゜ッドが含たれおいるはずですJOINずむンデックスを䜿甚。

説明したいく぀かの方法速床枬定、むンデックス付け、最適化、キャッシュなどを䜿甚するこずの効率ず信頌性に぀いおは倚くの議論があるため、最終的な決定はあなた次第です。いずれにせよ、今考えるべき遞択肢がありたす。

数か月たたは数幎の通垞の操䜜埌にサむトの動䜜が遅くなった堎合、理由を芋぀けるために䜕かを始める必芁がありたす。



PS , , .

PPS Q&A , Google Page Speed Online .



All Articles