2013-02-20 51 views
0

我想用php和mysql为新闻网站创建一个快速的表结构。我的数据库结构是ID,标题,内容,cat_ids(;分类标识的类别 - ; 5; 10; 15; 20;),active,publish_date。新闻网站的SQL表结构

我想做一个快速查询来从这张表中选择新闻。类似的东西:

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查询是非常缓慢的。我需要一些想法来使结构更加快速。

+2

创建索引。 – 2013-02-20 10:06:47

+2

请勿使用'LIKE' - 它不使用索引。 – DaveP 2013-02-20 10:07:23

+0

我必须用户LIKE和我使用索引:) – 2013-02-20 10:10:11

回答

0

而不是使用cat_ids列,试着用news_idcat_id,创造了news_cats表,并使用此查询:

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 
0

的一些建议如下:

1)"active"场创建索引
2)在"publish_date"字段创建索引
3)为类别和新闻关系创建单独的表并删除"cat_ids"从新闻表字段

新表看起来象下面这样:

news_category_ids

news_id
CATEGORY_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