从 varchar 更改为 mediumtext 会导致性能下降
Posted
技术标签:
【中文标题】从 varchar 更改为 mediumtext 会导致性能下降【英文标题】:Changing from varchar to mediumtext causes performance degradation 【发布时间】:2017-12-05 11:38:41 【问题描述】:我有一个存储网站产品评论的表格。该表使用 varchar(1000) 存储评论评论平均响应时间为 0.5 秒。我将保存数据的列的数据类型更改为mediumtext,页面响应时间跳到1.5-2秒。请记住,该列中没有添加其他数据,php 代码是相同的。
我认为查询时间不是问题,因为 mysql 报告它需要 0.019 秒,无论是 varchar 还是 mediumtext 都是一样的。
我不知道这里发生了什么。我正在使用 MySQL PDO 和 PHP。我不知道这是服务器问题,mediumtext 的固有问题,还是完全其他问题。
我尝试将表类型从 MyISAM 更改为 InnoDB,但没有任何区别。
这是 PHP 代码:
$charset = 'utf8mb4';
$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$attrs = array(PDO::ATTR_PERSISTENT => true);
$pdo = new PDO($dsn, $user, $pass, $attrs);
$stmt = $pdo->prepare("SELECT SQL_NO_CACHE comment
FROM reviews_product_comments
WHERE part_id =:partid
and language =:language");
foreach ($parts as $part)
// bind the parameters
$stmt->bindValue(":partid", $part);
$stmt->bindValue(":language", "en");
if ($stmt->execute())
if ($row = $stmt->fetch(PDO::FETCH_ASSOC))
$comment = $row['comment'];
echo $comment . "<br>";
$pdo = null;
有什么想法吗?
【问题讨论】:
所以你必须分析你的代码,让自己知道应该归咎于哪一部分 我在每个测试用例中使用相同的 PHP 代码。使用 varchar 访问表时,响应时间为 0.5 秒,使用 mediumtext 时,它会跳转到 1.5 秒 +。代码是相同的,唯一的区别是数据类型。所以我认为代码不是问题。此外,两种情况下的 MySQL 查询时间都报告为 ~0.015 秒。 在“mysql”下你的意思肯定是“我在 phpmyadmin 中运行这个查询”,对吧? 我们讨论了多少评论?几百还是几十万? @YourCommonSense 我正在使用 Navicat,它会为每个查询显示配置文件和状态。索引或查询绝对没有问题。查询很简单:SELECT comment FROM reviews_product_cmets WHERE part_id = ?和语言 = ?; part_id 和语言列被索引。 【参考方案1】:这两种数据类型的处理方式几乎相同。迟缓还有许多其他可能的原因。 (但据我所知,没有人会说 MEDIUMTEXT
比 VARHAR
差。)
那么...让我们看看我们是否可以加快网页速度...
将microtime(true)
放在mysql 调用周围——以确保它是MySQL,而不是PHP。 “0.019secs”是有道理的; “1.5 - 2 秒”听起来像是 PHP 中发生的事情。
使用 InnoDB,不 MyISAM。 (尽管你声称相反。)
正确调音;让我们看看SHOW VARIABLES LIKE '%buffer%';
你有多少内存? (交换对性能来说很糟糕。)
您要返回多少行?一个网页上几十个是不现实的,所以加ORDER BY...LIMIT...
。
如果 UI 限制为 1000 个字符,请使用 TEXT
或 VARCHAR(1000)
,而不是 MEDIUMTEXT
。如果您尝试增加多达 64K 字节(可能 4K utf8mb4 字符),请使用TEXT
。
您确实需要这个(列按任意顺序):
INDEX(part_id, language)
如果 MyISAM 表中有很多“流失”(删除和/或更新,然后是更多插入),则数据可能会出现碎片,因此速度很慢。 VARCHAR
和 TEXT
都可能发生这种情况。 InnoDB 不会发生这种情况。
【讨论】:
以上是关于从 varchar 更改为 mediumtext 会导致性能下降的主要内容,如果未能解决你的问题,请参考以下文章
如何将复合键列类型从 varchar 更改为 nvarchar?
MySql varchar 从 Latin1 更改为 UTF8