【发布时间】: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