0

phpとmysqlでニュースサイト用の高速なテーブル構造を作りたいです。私のデータベース構造は、ID、タイトル、コンテンツ、cat_ids (; カテゴリの区切り ID - ;5;10;15;20;)、active、publish_date です。

このテーブルからニュースを選択する高速クエリを作成したいと考えています。そんな感じ:

SELECT id 
FROM news 
WHERE cat_ids LIKE '%;15;%' 
  AND active = 1 
  AND publish_date < NOW() 
ORDER by publish_date DESC 
LIMIT 0, 10

しかし、テーブルが 2 ~ 3GB の場合、クエリは非常に遅くなります。構造を作成し、選択を高速化するためのアイデアが必要です。

4

2 に答える 2

0

cat_idscolumnを使用する代わりに、とを使用してnews_catsテーブルを作成し、次のクエリを使用してみてください。news_idcat_id

SELECT id 
FROM news JOIN news_cats ON news_id = id
WHERE cat_id = 15
  AND active = 1 
  AND publish_date < NOW() 
ORDER by publish_date DESC 
LIMIT 0, 10
于 2013-02-20T10:11:27.517 に答える
0

以下のようないくつかの提案:

1) フィールドに索引を作成する 2)"active"フィールドに索引を 作成する 3) カテゴリとニュース関係用に別のテーブルを作成し、ニュース テーブルからフィールドを削除する
"publish_date"
"cat_ids"

新しいテーブルは次のようになります。

news_category_ids

ニュース_id
カテゴリ_id

news_id ごとに複数の行を持つことができます。ニュース項目が 3 つのカテゴリに分類される場合、3 つの行になります。

次に、以下のように SQL を使用します。

SELECT news.id 
FROM news INNER JOIN news_category_ids ON news.id =  news_category_ids.news_id
WHERE 1
  AND news.active = 1 
  AND news_category_ids.cat_id = 15
  AND news.publish_date < NOW() 
ORDER by news.publish_date DESC 
LIMIT 0, 10
于 2013-02-20T10:14:50.790 に答える