最近30天为MYSQL创建视图

时间:2010-06-04 18:41:03

标签: php mysql query-optimization

我知道我写的查询错了,当我们收到大量流量时,我们的数据库被点击HARD并且页面变慢了...... 我想我需要在CURDATE的最后30天内根据CREATE VIEW编写查询?但不知道从哪里开始,或者这对数据库的查询效率会更高吗?

无论如何,这是我写的一个示例查询..

$query_Recordset6 = "SELECT `date`, title, category, url, comments 
                       FROM cute_news 
                      WHERE category LIKE '%45%' 
                   ORDER BY `date` DESC";

任何帮助或建议都会很棒!我有大约11个这样的查询,但我相信如果我可以获得其中一个的帮助,那么我可以实现其余的!!

7 个答案:

答案 0 :(得分:2)

在值比较的左侧放置通配符:

LIKE '%xyz'

...表示即使存在索引也无法使用索引。可能要考虑使用Full Text Searching (FTS), which means adding full text indexing

规范化数据将是另一个需要考虑的步骤 - 类别应该在一个单独的表中。

答案 1 :(得分:0)

SELECT `date`, title, category, url, comments 
                       FROM cute_news 
                      WHERE category LIKE '%45%' 
                   ORDER BY `date` DESC

LIKE '%45%'表示需要执行全表扫描。您是否可以在列中存储类别列表?如果是这样,创建一个存储类别和news_article_id的新表将允许使用索引更有效地检索匹配的记录。

答案 2 :(得分:0)

好的,精神调试的时间。

在我看来,我发现通过数据库规范化可以大大提高查询性能,特别是通过将类别多值列拆分为一个包含两列的单独表:cute_news的主键和类别ID。

这也允许您直接将所述表链接到类别表,而无需先解析它。

或者,正如Chris Date所说:“每个行 - 列交集都只包含适用域中的一个值(没有别的)。”

答案 3 :(得分:0)

任何喜欢'%XXX%'的东西都会变慢。这是一个缓慢的操作。

对于类似的东西,您可能希望将类别分成另一个表,并在cute_news表中使用外键。这样你就可以拥有category_id,并在查询中使用它会更快。


另外,我不太清楚为什么你在谈论使用CREATE VIEW。视图不会真正帮助您提高速度。除非它是一个物化视图,MySQL本身并不认为。

答案 4 :(得分:0)

如果您的数据库受到重创,解决方案就是不进行查看(视图仍然与数据库的工作量基本相同),解决方案是缓存结果。

这一点特别适用,因为从听起来来看,您的数据只需要每30天刷新一次。

答案 5 :(得分:0)

我猜你的category列是一个类别值列表,如“12,34,45,78”?

这不是很好的关系数据库设计。其中一个不好的原因是你发现:搜索可能出现在该列表中间的子字符串的速度非常慢。

有些人建议使用全文搜索而不是带有通配符的LIKE谓词,但在这种情况下,创建另一个表更简单,这样您就可以列出每行一个类别值,并将引用返回到{{ 1}}表:

cute_news

然后你可以查询它会更快:

CREATE TABLE cute_news_category (
  news_id INT NOT NULL,
  category INT NOT NULL,
  PRIMARY KEY (news_id, category),
  FOREIGN KEY (news_id) REFERENCES cute_news(news_id)
) ENGINE=InnoDB;

答案 6 :(得分:0)

任何答案都是猜测,显示:
- 相关的SHOW CREATE TABLE输出
- 来自常见查询的EXPLAIN输出。

Bill Karwin的评论肯定适用。

毕竟这&优化,将数据采样到最近30天的表中仍然是可取的,在这种情况下,您最好运行每日cronjob来做到这一点。