2011-01-14 16 views
3

私は、Wordpressセルフホスト型CMSを使用してウェブサイトを開発しています。百万行のテーブルからクエリを選択して最適化

このページの1つでは、私はワードプレスデータベースにクエリを実行して、投稿が既に投稿されているかどうかを確認する機能を実行しました。私はそれをチェックするためにタイトルを比較しています。ここで

は私のクエリです:

$wpdb->get_row("SELECT id FROM wp_posts WHERE post_title = '" . $title . "'", 'ARRAY_A'); 

は、だから私は$タイトルが掲載されているかどうかをチェックしています、しかし、聞かせて成長するポストの数は1万件の投稿をして言うならば、私は怖い、怖いですそれそれ

このクエリをより速くする方法についてのご意見はありますか?私はCREATE INDEXとMySQLのキャッシュについて聞いたが、私はそれを実装する方法を理解していない..すべての説明と参考提案は高く評価されます。

+1

うわー、ワードプレスのブログで100万ポスト?あなたは、あなたの前にいくつかの大きなブログ計画を持っている必要があります。 –

+0

あなたはあなた自身をウェブの多くの種類にワードプレスをホストすることができます。ブログだけではなく、ブログに近いウェブサイトには本当にたくさんの投稿があります。ええ、最大の柔軟性のためにCMSなしで構築する方が良いかもしれません。D – ayublin

答えて

1

これを試してみてください:

CREATE INDEX IX_wp_posts_post_title ON wp_posts (post_title) 

インデックスの作成は長い時間がかかりますが、その後、あなたのクエリが瞬時に近くなければなりません。

+0

ありがとうMark、そして一度インデックスを作成すると、CREATE INDEXプロセスの後に挿入された新しい行が自動的にインデックスを持つようになりますか? – ayublin

+0

はい、そうです。 –

1

ここではpost_titleを探している場所など、データのクエリに使用される最も一般的な列に基づいてテーブルにインデックスを作成します。

さらに、SQL-Select文を自分のように作成しているので、SQLインジェクション攻撃が広く行われているため、文字列をエスケープして、パラメータ化されたクエリ呼び出しを使用することをお勧めします。

+0

DRappに感謝します。パラメータ化されたクエリについて読んで、自分のコードを修正します。 – ayublin

0

あなたがここで達成しようとしていることはよく分かりません。同じタイトルの2つの記事を持つことは、世界の終わりのようではありません。

詳細については、あなたのコードは完全にSQL注入可能です。それを読んで、パラメータ化されたクエリを使用してください。

インデックスの作成は簡単です。

作成インデックスmyindex mytable(columnname);

これは選択に役立ちますが、実際にという数百万行の行がある場合は、適切なデータベースのアドバイスを得ることをお勧めします。データを分割する必要があります。

+0

私はグーグルによって嫌われている重複したコンテンツを恐れています。 – ayublin

0

特定の投稿が既にデータベースにあるかどうかを確認する場合は、タイトルの代わりに投稿のIDを使用してテストする必要があります。 1つは一意の識別子(プライマリキーであることが前提)であるため、クエリではそれをはるかに高速に検索できるため2つです。

関連する問題