ホームページ >データベース >mysql チュートリアル >データベースの速度を最適化するための 10 のヒント
データベース速度を最適化するための 10 のヒント
ほとんどの Web サイト コンテンツはデータベースに保存され、ユーザーはリクエストを通じてコンテンツにアクセスします。データベースは非常に高速であり、サーバー リソースを無駄にしないようにデータベースの速度を最適化できる技術が多数あります。この記事では、データベースの速度を最適化するための 10 のヒントを紹介しました。
1. データベースを慎重に設計する
最初のヒントは明白に思えるかもしれませんが、実際、データベースの問題のほとんどは、設計が不十分なデータベース構造に起因しています。
例えば、顧客情報と支払い情報が同じデータベース列に格納されている例に遭遇したことがあります。これはシステム開発者やデータベース開発者にとって好ましくありません。
新しいデータベースを作成するときは、標準の命名方法と主キーを使用して、情報を別のテーブルに保存する必要があります。
出典: http://www.simple-talk.com/sql/database-administration/ten-common-database-design-missing/
2. 最適化するために何が必要かを知る
何かを最適化したい場合クエリ ステートメント。このステートメントの結果を明確に知ることは非常に役立ちます。 EXPLAIN ステートメントを使用すると、多くの有益な情報が得られます。例を見てみましょう:
EXPLAIN SELECT * FROM ref_table,other_table WHERE ref_table.key_column=other_table.column;
出典: http://dev.MySQL .com /doc/refman/5.0/en/using-explain.html
3. 最速のクエリステートメント…送信しなかったクエリステートメントです
データベースにステートメントを送信するたびに、大量のサーバーリソース。したがって、トラフィックの多い Web サイトでは、クエリ ステートメントをキャッシュするのが最善の方法です。
ステートメントをキャッシュする方法はたくさんありますが、そのいくつかを以下に示します:
AdoDB: AdoDB は、PHP データベースの簡易ライブラリです。これを使用すると、さまざまなデータベース システム (MySQL、PostGreSQL、Interbase など) から選択でき、速度を重視して設計されています。 AdoDB は、シンプルだが強力なキャッシュ システムを提供します。また、AdoDB には BSD ライセンスがあるため、プロジェクトで無料で使用できます。商用プロジェクトの場合は、LGPL ライセンスも取得しています。
Memcached: Memcached は、データベースの負荷を軽減し、動的データベースに基づいて Web サイトを高速化できる分散メモリ キャッシュ システムです。
CSQL Cache: CSQL Cache は、オープンソースのデータ キャッシュ アーキテクチャです。試したことはありませんが、とても良さそうです。
4. 必要のないものは選択しないでください
必要なデータを取得するには、すべての列をリストする * 文字を使用するのが一般的な方法です。
SELECT * FROM wp_posts;
ただし、以下に示すように、必要な列のみをリストする必要があります。非常に小規模な Web サイトの場合、たとえば 1 分間に 1 人のユーザーがアクセスする場合は、何の違いも生じない可能性があります。ただし、Cats Who Code のようなトラフィックの多い Web サイトの場合、これによりデータベースの作業が大幅に節約されます。
SELECT title, excerpt, author FROM wp_posts;
5. LIMITを使う
特定の行数のデータのみを取得することは非常に一般的です。たとえば、ブログには 1 ページに 10 件の記事しか表示されません。このとき、LIMIT を使用して、選択するデータの行数を制限する必要があります。
LIMIT がなく、テーブルに 100,000 行のデータがある場合、すべての行を走査することになり、サーバーに不必要な負担がかかります。
SELECT title, excerpt, author FROM wp_posts LIMIT 10;
6. ループ内のクエリを避ける
PHPでSQLを使う場合、SQLをループ文の中に入れることができます。ただし、そうするとデータベースにさらなる負担がかかります。
次の例は、「ループ ステートメント内のクエリ ステートメントのネスト」の問題を示しています:
foreach ($display_order as $id => $ordinal){ $sql = "UPDATEcategories SET display_order = $ordinal WHERE id = $id "; mysql_query($sql); }
これを実行できます:
カテゴリを更新 SET display_order = CASE id WHEN 1 THEN 3 WHEN 2 THEN 4 WHEN 3 THEN 5 END WHERE id IN (1,2,3 )
出典: http://www.karlrixon.co.uk/articles/sql/update-multiple-rows-with- Different-values-and-a-single-sql-query/
7. 結合を使用して置換しますサブクエリ
プログラマーはサブクエリを使用したり、乱用したりする場合があります。次のサブクエリは非常に便利です:
SELECT a.id, (SELECT MAX(created) FROM jobs WHERE author_id = a.id) AS last_post FROM authors a
サブクエリは便利ですが、join ステートメントで置き換えることができます。 join ステートメントの実行が高速になります。
SELECT a.id, MAX(p.created) AS last_post FROM authors a INNER JOIN 投稿 p ON (a.id = p.author_id) GROUP BY a.id
出典: http://20bits.com/articles /10-tips-for-optimizing-mysql-queries-that-dont-suck/
8. ワイルドカードは慎重に使用してください
ワイルドカードは非常に簡単に使用できます。データを検索するときに、ワイルドカードを使用して 1 つ以上の文字を置き換えることができます。使用できないとは言いませんが、使用する場合は注意が必要で、前置ワイルドカードや後置ワイルドカードを使用しても同じ作業が行われる可能性がありますので使用しないでください。
実際、何百万ものデータに対して単語全体のワイルドカード検索を使用すると、データベースがクラッシュします。
#完全なワイルドカード SELECT * FROM TABLE WHERE COLUMN LIKE '%hello%'; #Postfix ワイルドカード ' %hello';
データベースのインデックスは、図書館にあるインデックスに似ています。図書館のインデックスと同じように、必要な情報をより迅速に取得できます。欲しい本をより早く見つけることができます。
インデックスは 1 つの列または複数の列に作成できます。インデックスは、テーブル内の 1 つ以上の列の値を特定の順序で編成するデータ構造です。
次のステートメントは、Product テーブルの Model 列にインデックスを作成します。このインデックスの名前は idxModel です
CREATE INDEX idxModel ON Product (Model); 上記は、データベースの速度を最適化するための 10 のヒントです。その他の関連記事については、PHP 中国語 Web サイト (www.php.cn) を参照してください。 )!