从 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】:

这两种数据类型的处理方式几乎相同。迟缓还有许多其他可能的原因。 (但据我所知,没有人会说 MEDIUMTEXTVARHAR 差。)

那么...让我们看看我们是否可以加快网页速度...

microtime(true) 放在mysql 调用周围——以确保它是MySQL,而不是PHP。 “0.019secs”是有道理的; “1.5 - 2 秒”听起来像是 PHP 中发生的事情。

使用 InnoDB, MyISAM。 (尽管你声称相反。)

正确调音;让我们看看SHOW VARIABLES LIKE '%buffer%';你有多少内存? (交换对性能来说很糟糕。)

您要返回多少行?一个网页上几十个是不现实的,所以加ORDER BY...LIMIT...

如果 UI 限制为 1000 个字符,请使用 TEXTVARCHAR(1000),而不是 MEDIUMTEXT。如果您尝试增加多达 64K 字节(可能 4K utf8mb4 字符),请使用TEXT

您确实需要这个(列按任意顺序):

INDEX(part_id, language)

如果 MyISAM 表中有很多“流失”(删除和/或更新,然后是更多插入),则数据可能会出现碎片,因此速度很慢。 VARCHARTEXT 都可能发生这种情况。 InnoDB 不会发生这种情况。

【讨论】:

以上是关于从 varchar 更改为 mediumtext 会导致性能下降的主要内容,如果未能解决你的问题,请参考以下文章

如何将表列从十进制更改为 varchar [重复]

将带有数字的列的类型从 varchar 更改为 int

如何将复合键列类型从 varchar 更改为 nvarchar?

MySql varchar 从 Latin1 更改为 UTF8

Oracle SQL 在包含数据时将列类型从数字更改为 varchar2

SQL Server 2008 - 从 Float 将列更改为 Varchar 产生科学记数法