mariadb MEDIUMTEXT COMPRESSED 更新需要更长时间

问题描述 投票:0回答:1

我使用 mariadb 来存储 HTML 文件,并将 HTML 的列定义为 MEDIUMTESET CONPRESSED,其他一些列存储 INT 和 VARCHAR 键。然而我遇到了一个相当奇怪的行为:

  1. 当我用 HTML 创建记录时,它很快
  2. 当我先创建一条记录,然后添加 HTML 时,添加一个 HTML 需要几分钟(!!!)。

不用说,HTML 没有索引(我认为你不能为压缩列建立索引)。表中有大约 100,000 个 HTML 文件。每个HTML文件大约150K

补充:

这是代码

 loadHTML(self, conn, driver, report=False):

    cleaner = Cleaner()
    cleaner.javascript = True # This is True because we want to activate the javascript filter
    cleaner.style = True      # This is True because we want to activate the styles & stylesheet filter

    preport(f"in selLoadHTML for {type(self)}") 
    cursor = conn.cursor()
    try:
        self.openMyURL(driver, report=report)
        preport(f"opened {self.url}") 
        the_html = driver.page_source
        preport(f"loaded {len(the_html)} bytes") 
        self.html = cleaner.clean_html(the_html)
        preport(f"cleaned {len(self.html)} bytes") 
        cursor.execute(""" update Page set html=%s, htmlLoaded=NOW(), htmlError=NULL""", (self.html,))
        preport(f"updated the database")
    except Exception as e:
        print(f"Error opening {self.url}, exception {e}")
        cursor.execute(""" update Page set htmlError=NOW()""")
    conn.commit()
    cursor.close()
    return 

preport
print
的包装,报告自上次报告以来的时间

这是一个输出:

After  0:00:08.334192 ,  opened <url here>
After  0:00:00.049598 ,  loaded 918988 bytes
After  0:00:00.032835 ,  cleaned 43692 bytes
After  0:03:06.277489 ,  updated the database

如您所见,花了 3 分钟多的时间才保存了 43K 的 HTML,在此之前该内容是 NULL

这是一个架构(简化)

CREATE TABLE Page (
url VARCHAR(100) UNIQUE KEY,
html MEDIUMTEXT COMPRESSED,
htmlError DATETIME,
refId int unsigned,
foreign key (refId) references Reference (refId)

对于其他一些情况,我只是填充数据库:

cur.execute("""INSERT INTO Reference (refId, refText) VALUES (%s, %s) ON DUPLICATE KEY UPDATE refText = %s""", (self.ref_id, self.ref_text, self.ref_text))
cur.execute("""INSERT IGNORE INTO Page (url, html, refId) VALUES (%s, %s, %s) """, (self.url, self.html, self.ref_id))

我没有性能数据,但它飞得很快——每条记录不超过几秒。

python mariadb mariadb-10.5
1个回答
0
投票
update Page set html=%s, htmlLoaded=NOW(), htmlError=NULL""", (self.html,)

如果没有Where子句,这将更新表中的每一行!

这就是为什么需要“永远”。

© www.soinside.com 2019 - 2024. All rights reserved.