【问题标题】:Optimizing querying 78,000,000 row table (MySQL)优化查询78,000,000行表(MySQL)
【发布时间】:2016-11-13 00:33:09
【问题描述】:

我有一个名为 tags_table 的表,其 id 列类型为 INT(11),标签列类型为 VARCHAR(200)

有大约 3,000,000 个唯一 ID 和大约 300,000 个唯一标签。 因为每个 id 有多个标签,所以大约有 78,000,000 行,这使得查询非常慢。查询的一个例子是SELECT id FROM tags_table WHERE tag = "flower"

如果我创建一个唯一标签表并修改 tags_table 以包含这些标签字符串的索引而不是字符串本身,我的查询会执行得更快吗?如果是这样,我该怎么做?我的目标是最小化查询持续时间。

这是表的创建语句:

CREATE TABLE `tags_table` ( `id` int(11) unsigned NOT NULL, `tag` varchar(200) CHARACTER SET utf8 NOT NULL, UNIQUE KEY `no_dup_tags` (`id`,`tag`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

【问题讨论】:

  • 您忘记了重要的事实 - 索引。你有吗?
  • 你能发布你的表格结构吗
  • @juergend 我有一个可以使 id-tag 对独一无二,但仅此而已
  • @jaidutt 我该怎么做?
  • 只要在tags 上有任何索引,最好是(tag, id)。使用第二个表会快一点,因为它会小很多,因为索引和表将包含整数而不是 utf8 varchar(200),但与使用索引相比,这将是一个小的加速,所以这可以是第 2 步。来自 jai 的全文索引也可以使用。只要您在tags 上有任何索引,您就会很高兴!

标签: mysql query-optimization mysql-workbench


【解决方案1】:

这似乎是一个经典的多对多映射表。一方面是tag。另一边是id,我假设它是某个其他表的 id?

您需要“独特”的是一对。这可以通过将(id, tag) 指定为唯一或将(tag, id) 指定为唯一来限制。无需指定两者都是唯一的。

“唯一性”可以由UNIQUE(...)PRIMARY KEY(...) 声明。

大概您想查找给定tag 的所有ids并且您还想查找给定id 的所有tags?那么你需要两个索引,一个以tag开头,一个以id开头。

Here 是构建最优映射表的 7 个技巧。

【讨论】:

    【解决方案2】:

    是的,您可以使用唯一标签创建另一个表,并对该列标签应用唯一索引并替换所有标签,并在当前表中再添加一列以将标签文本更改为 id,然后对该 id 列进行简单索引。

    如果您不想进行任何更改,只需在标签列上使用全文索引

    ALTER TABLE table_name  
    ADD FULLTEXT(column_name1) 
    

    注意:MyISAM 有 FULLTEXT 搜索索引,而 InnoDB 直到 MySQL 5.6(2013 年 2 月)才有。

    【讨论】:

    • 这样做真的会显着加快我的查询速度吗?
    • 去掉UNIQUE的目的是什么?
    • 您可以通过在查询前加上说明来检查它。在您当前的查询中,索引长度是两倍。
    猜你喜欢
    • 2013-06-02
    • 2016-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多