【问题标题】:Optimizing mySQL database on large table with frequent writes and fulltext columns?在具有频繁写入和全文列的大型表上优化 mySQL 数据库?
【发布时间】:2011-12-27 21:46:49
【问题描述】:

我的团队经营着一个购物信息网站,随着我们的发展,我们开始遇到产品表上的查询响应时间影响显示速度的问题。

我们遇到的主要问题是当用户“保存”一个触发更新查询的项目时,其他用户正在搜索也存在的 FULLTEXT 索引:

UPDATE product SET listed = listed+1 WHERE product_id = XX

例如,我刚刚在 0.01 秒内运行更新,但几分钟前没有其他查询命中,同时还有一个大型 FULLTEXT 请求,同样的请求花了 23 秒。

我认为这是因为该表是 MISAM 并且不能执行行级锁定。

我们的产品表包含超过 350 万条记录,到月底将翻一番。之后,它应该会稳定到每月增长 2-5%。

CREATE TABLE product (
    product_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
    category_id INT UNSIGNED NOT NULL DEFAULT '0',
    title VARCHAR (100) NOT NULL DEFAULT '',
    short_desc VARCHAR (255) NOT NULL DEFAULT '',
    description TEXT NOT NULL,
    msrp DECIMAL (6,2) NOT NULL DEFAULT '000.00',
    rating DECIMAL(3,2) NOT NULL DEFAULT '0.0',
    reviews INT UNSIGNED NOT NULL DEFAULT '0',
    listed INT UNSIGNED NOT NULL DEFAULT '0',
    sku VARCHAR(75) NOT NULL DEFAULT '0',
    upc VARCHAR(20) NOT NULL DEFAULT '0',
    updateddate DATETIME NOT NULL,
    PRIMARY KEY (product_id),
    KEY title (title),
    KEY category_id (category_id),  
    KEY listed (listed),
    KEY mfrg_id (mfrg_id),
    KEY identifier (identifier),
    FULLTEXT INDEX (title),
    FULLTEXT INDEX (description)
) ENGINE = MYISAM;

数据库在仅托管我们网站的专用服务器上运行。我们计划将数据库移动到一个复制结构中,其中包含一个 Dual Proc、16gb RAM 服务器用于查询框 [slave] 和当前处理写入的“web”服务器 [dual proc, 4gb ram]。

[显然]我不是数据库专家,并且从研究中开始对与 MYISAM [复制和备份影响?] 同时运行 InnoDB 持谨慎态度,但这似乎确实像拆分产品表以容纳主要信息 [innodb]单独的全文描述 [myisam] 可能会有很大帮助?

如果您有想法并需要更多信息,请发表评论,我会提供更多详细信息。

谢谢

【问题讨论】:

    标签: mysql query-optimization innodb myisam


    【解决方案1】:

    你对 MyIsam 很准确。它是表锁而不是像 innoDB 那样的行锁。

    所以从你说的情况来看,查询(全文)花费了很多时间,所以更新需要等待才能完成。

    您真的应该考虑切换到 innoDB(简单的解决方案)或将您的全文搜索切换到其他地方,例如 solr、elastic search、sphinx。

    此外,您应该检查您的 slow_query 日志并优化所有这些查询。

    【讨论】:

    • 感谢您的洞察力。你有什么想法把事情分成两个表,分别是 myisam 和 innodb 类型?
    • 取决于很多东西,时间-经验-金钱。最简单的方法之一是将全文字段移动到另一个表格。因此,当您进行“慢速搜索”时,您仍然可以更新您的源表。我认为 MyISAM 全文中的 7M 行数据似乎很多。
    • 猜猜我们又要调查斯芬克斯了。关于与此相关的设置有什么特别的想法吗?只有一个表用于产品,它建立在关键字段之上,还是仍然有理由将事情分成两个 [innodb] 表?
    • 我不会在 cmets 中讨论这个问题。如果您删除 MyISAM,您将丢失全文搜索,因此您需要找到另一种解决方案,例如 Sphinx。
    猜你喜欢
    • 2010-11-09
    • 1970-01-01
    • 2012-01-06
    • 1970-01-01
    • 2015-08-24
    • 1970-01-01
    • 2020-08-11
    • 2021-03-08
    • 1970-01-01
    相关资源
    最近更新 更多