Mysql 使用mediumtext时出现性能问题,导致页面速度慢
我一直在使用Google PageSpeed Insights分析我的网站的性能,它报告的主要问题是服务器响应时间慢,平均大约1.5-2秒。谷歌建议尝试达到200毫秒,所以我还远远不够 我所确定的是,从数据库检索数据的查询会导致相当严重的性能问题。我的网站广泛使用缓存来检索网站的各个部分。整个网页通常可以从缓存表中的5个数据库查询生成 当我硬编码返回值时(注意“这是一个测试”选项): 服务器响应速度降至0.5秒。当我将其放回选择实际数据列页面_body时,如下所示:Mysql 使用mediumtext时出现性能问题,导致页面速度慢,mysql,performance,database-performance,Mysql,Performance,Database Performance,我一直在使用Google PageSpeed Insights分析我的网站的性能,它报告的主要问题是服务器响应时间慢,平均大约1.5-2秒。谷歌建议尝试达到200毫秒,所以我还远远不够 我所确定的是,从数据库检索数据的查询会导致相当严重的性能问题。我的网站广泛使用缓存来检索网站的各个部分。整个网页通常可以从缓存表中的5个数据库查询生成 当我硬编码返回值时(注意“这是一个测试”选项): 服务器响应速度降至0.5秒。当我将其放回选择实际数据列页面_body时,如下所示: $sql = "SELECT
$sql = "SELECT page_body
FROM cache_copy
WHERE url = ?
AND language = ?
AND currency = ?";
$stmt = $conn->prepare($sql);
if (!$stmt) {
ThrowDBError($conn, $stmt, $sql);
}
$stmt->bind_param('sss', $url, $language, $currency);
if (!$stmt->execute()) {
ThrowDBError($conn, $stmt, $sql);
}
$stmt->bind_result($cache);
$stmt->fetch();
$stmt->close();
对于网站对缓存表进行的5次查询,服务器响应时间持续跳至1.5-2秒
缓存表只包含8000行,我想我已经正确地为它编制了索引。专栏页面_body是一个mediumtext-有人知道使用mediumtext的性能相关问题吗?我只是不明白为什么它会增加1.5秒的加载时间
以下是缓存表的DDL:
CREATE TABLE `cache` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`url` varchar(255) NOT NULL,
`language` varchar(2) NOT NULL,
`currency` varchar(3) NOT NULL,
`page_body` mediumtext NOT NULL,
`cached_time` datetime NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `url, language, currency` (`url`,`language`,`currency`) USING BTREE,
KEY `cached_time` (`cached_time`) USING BTREE
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
有什么想法吗?
非常感谢它返回多少行?如果它只返回一行,它应该在200ms以下 哦!!这就是问题所在。您正在使用MyISAM。不要。切换到InnoDB
如果实际的表类似于
缓存
,您将从中获得几乎相同的速度。我建议您去掉缓存。如果您必须运行5个查询才能生成1个页面,那么花费这么长的时间是合理的。。您的代码可能没有问题,但使用了糟糕的缓存方法。。根据我的经验,缓存是在web服务器上完成的,并在客户端之间共享。。数据库侧视图用于自动缓存查询。。有时,如果您在web服务器上看到高cpu,则需要使用load ballancer。。通过浏览器gzip压缩和缓存,前端js/css/images上进行了大量优化。。也看看这个谢谢你的回复。在我的OP中,我测试了5个返回硬编码文本的查询(“这是一个测试”),这对响应时间没有影响。问题似乎是返回实际数据,而不是执行查询本身的开销。问题似乎是当我从表中获取“真实”数据时。作为附加测试,我复制了一个用于存储评论的表,该表使用varchar(1000)作为评论。在复制表上,我将类型更改为mediumtext。varchar响应快,mediumtext响应慢。问题显然在于使用mediumtext作为数据类型。这个问题是由于mysqli的一个已知限制造成的,如下所述:解决方案是使用store_result(),如下所示:if(!$stmt->execute()){ThrowDBError($conn,$stmt,$sql);}$stmt->store_result()$stmt->bind_结果($cache);
CREATE TABLE `cache` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`url` varchar(255) NOT NULL,
`language` varchar(2) NOT NULL,
`currency` varchar(3) NOT NULL,
`page_body` mediumtext NOT NULL,
`cached_time` datetime NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `url, language, currency` (`url`,`language`,`currency`) USING BTREE,
KEY `cached_time` (`cached_time`) USING BTREE
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;