【问题标题】:Performance issue using mediumtext causing slow page speed [duplicate]使用 mediumtext 导致页面速度变慢的性能问题 [重复]
【发布时间】:2018-05-18 10:43:09
【问题描述】:

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

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

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

$sql = "SELECT 'This is a test' 
        FROM cache 
        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();

服务器响应速度降至 0.5 秒。当我把它放回去选择实际数据列page_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 秒。

缓存表只包含 8,000 行,我想我已经正确地索引了它。 page_body 列是中文本 - 有人知道使用中文本的性能相关问题吗?我只是想不通为什么它会增加 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;

有什么想法吗? 非常感谢

【问题讨论】:

  • 如果您必须运行 5 次查询才能生成 1 页,那么花费这么长时间是合理的。您的代码可能没有问题,但是使用了糟糕的缓存方法。根据我的经验,缓存是在 Web 服务器上完成并在客户端之间共享。在 db 侧视图用于自动缓存查询。有时如果您在 Web 服务器上看到高 cpu,则需要使用负载均衡器。在前端 js/css 上进行了很多优化/images 通过浏览器 gzip 压缩和缓存.. 另请查看 stackoverflow.com/a/7875699/3254405
  • 感谢您的回复。在我的 OP 中,我测试了运行 5 个返回硬编码文本(“这是一个测试”)的查询,它对响应时间没有影响。问题似乎是返回实际数据,而不是执行查询本身的开销。问题似乎出在我从表中获取“真实”数据时。
  • 作为附加测试,我复制了一个用于存储评论的表,该表使用 varchar (1000) 作为评论评论。在重复表上,我将类型更改为 mediumtext。 varchar 响应快,mediumtext 响应慢。问题显然在于使用 mediumtext 作为数据类型。

标签: mysql performance database-performance


【解决方案1】:

它返回多少行?如果它只返回 1 行,它应该远低于 200 毫秒。

哦!是看问题。您正在使用 MyISAM。别。切换到 InnoDB。

如果真正的表像cache,您将获得几乎相同的速度。我建议你摆脱缓存。

【讨论】:

  • 这个问题是由于mysqli的一个已知限制,解释如下:bugs.php.net/bug.php?id=51386 解决方案是使用store_result(),如下所示:if (!$stmt->execute()) { ThrowDBError($conn, $stmt, $sql); } $stmt->store_result(); $stmt->bind_result($cache);
猜你喜欢
  • 2016-06-17
  • 2023-01-12
  • 2012-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多