Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 为MYSQL创建过去30天的视图_Php_Mysql_Query Optimization - Fatal编程技术网

Php 为MYSQL创建过去30天的视图

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

我知道我写的查询是错误的,当我们获得大量的流量时,我们的数据库会受到严重的冲击,页面会变得很慢。。。 我想我需要在CURDATE的最后30天内基于CREATE视图编写查询??但不确定从哪里开始,或者这是否会更有效地查询数据库

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

$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