我知道我写的查询错了,当我们收到大量流量时,我们的数据库被点击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个这样的查询,但我相信如果我可以获得其中一个的帮助,那么我可以实现其余的!!
答案 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来做到这一点。