Php 为MYSQL创建过去30天的视图
我知道我写的查询是错误的,当我们获得大量的流量时,我们的数据库会受到严重的冲击,页面会变得很慢。。。 我想我需要在CURDATE的最后30天内基于CREATE视图编写查询??但不确定从哪里开始,或者这是否会更有效地查询数据库 无论如何,这是我写的一个示例查询Php 为MYSQL创建过去30天的视图,php,mysql,query-optimization,Php,Mysql,Query Optimization,我知道我写的查询是错误的,当我们获得大量的流量时,我们的数据库会受到严重的冲击,页面会变得很慢。。。 我想我需要在CURDATE的最后30天内基于CREATE视图编写查询??但不确定从哪里开始,或者这是否会更有效地查询数据库 无论如何,这是我写的一个示例查询 $query_Recordset6 = "SELECT `date`, title, category, url, comments FROM cute_news
$query_Recordset6 = "SELECT `date`, title, category, url, comments
FROM cute_news
WHERE category LIKE '%45%'
ORDER BY `date` DESC";
任何帮助或建议都会很好!我有大约11个这样的查询,但我相信如果我能在其中一个问题上得到帮助,那么我就可以将它们实现到其他问题上
SELECT `date`, title, category, url, comments
FROM cute_news
WHERE category LIKE '%45%'
ORDER BY `date` DESC
类似于“%45%”的
表示需要执行完整的表扫描。您是否正在列中存储类别列表?如果是这样,创建一个存储类别和新闻文章id的新表将允许使用索引更有效地检索匹配的记录。在值比较的左侧放置一个通配符:
LIKE '%xyz'
…意味着即使存在索引,也无法使用索引。可能想考虑使用.< /P>
标准化数据将是另一个要考虑的步骤-类别应该可能在一个单独的表中。
< P> OK,心灵调试的时间。< /P>
在我看来,通过数据库规范化,查询性能将大大提高,特别是通过将category多值列拆分为一个单独的表,该表有两列:《可爱新闻》的主键和category ID
这还允许您直接将所述表链接到categories表,而无需首先解析它
或者,正如Chris Date所说:“每一行和列的交叉点都只包含一个来自适用域的值(而没有其他值)。”任何像“%XXX%”这样的值都会很慢。这是一个缓慢的操作
对于类似类别的内容,您可能希望将类别分离到另一个表中,并在cute_news表中使用外键。这样您就可以拥有category_id,并在查询中使用它,这将更快
另外,我不太清楚您为什么要谈论使用createview。视图并不能真正帮助您提高速度。除非它是一个物化视图,MySQL本机并不这么认为 如果数据库受到严重影响,解决方案不是创建视图(视图的工作量基本上与数据库相同),而是缓存结果
这一点特别适用,因为从听起来的情况来看,您的数据只需要每30天刷新一次。我猜您的category
列是一个类别值列表,如“12,34,45,78”
这不是很好的关系数据库设计。它不好的一个原因是你发现的:搜索一个可能出现在列表中间的子串是非常缓慢的。
有些人建议使用全文搜索,而不是使用带有通配符的LIKE
谓词,但在这种情况下,创建另一个表更简单,这样您就可以每行列出一个类别值,并引用回您的可爱的新闻
表:
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;
然后您可以进行查询,查询速度会快得多:
SELECT n.`date`, n.title, c.category, n.url, n.comments
FROM cute_news n
JOIN cute_news_category c ON (n.news_id = c.news_id)
WHERE c.category = 45
ORDER BY n.`date` DESC
任何答案都是猜测,显示:
-相关的显示创建表输出
-解释常见查询的输出
比尔·卡温的评论当然适用
经过所有这些&优化之后,仍然可以只在最后30天内将数据采样到一个表中,在这种情况下,您最好运行一个每日cronjob来完成这项工作。想知道这是否会更好?选择。。。从…起限制50