Mysql 使用mediumtext时出现性能问题,导致页面速度慢

Mysql 使用mediumtext时出现性能问题,导致页面速度慢,mysql,performance,database-performance,Mysql,Performance,Database Performance,我一直在使用Google PageSpeed Insights分析我的网站的性能,它报告的主要问题是服务器响应时间慢,平均大约1.5-2秒。谷歌建议尝试达到200毫秒,所以我还远远不够 我所确定的是,从数据库检索数据的查询会导致相当严重的性能问题。我的网站广泛使用缓存来检索网站的各个部分。整个网页通常可以从缓存表中的5个数据库查询生成 当我硬编码返回值时(注意“这是一个测试”选项): 服务器响应速度降至0.5秒。当我将其放回选择实际数据列页面_body时,如下所示: $sql = "SELECT

我一直在使用Google PageSpeed Insights分析我的网站的性能,它报告的主要问题是服务器响应时间慢,平均大约1.5-2秒。谷歌建议尝试达到200毫秒,所以我还远远不够

我所确定的是,从数据库检索数据的查询会导致相当严重的性能问题。我的网站广泛使用缓存来检索网站的各个部分。整个网页通常可以从缓存表中的5个数据库查询生成

当我硬编码返回值时(注意“这是一个测试”选项):

服务器响应速度降至0.5秒。当我将其放回选择实际数据列页面_body时,如下所示:

$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;