【问题标题】:Indexing all Vs. Indexing some索引所有 Vs。索引一些
【发布时间】:2011-09-22 07:59:46
【问题描述】:

我正在阅读这个问题MySQL - why not index every field? 并决定做一些测试。

有两个等效的表(a 和 b),每个表有 5.000.000 行和 3 列(int、int、varchar),我索引了表 b 上的所有列,只索引了表上的一列(主键)一个。

结果如下:

编辑:更改/未更改行的时间与以下相同。

mysql> update a set c = '1000000' where c = '1000000';
Query OK, 0 rows affected (2.13 sec)
Rows matched: 1  Changed: 0  Warnings: 0

mysql> update b set c = '1000000' where c = '1000000';
Query OK, 0 rows affected (0.00 sec)
Rows matched: 1  Changed: 0  Warnings: 0

现在,这与我阅读问题答案后的预期完全相反。

不索引表的每一列是否有任何“可基准”的缺点?


编辑:问题是表中的每个元组都有一个唯一值,并且更新单个索引和唯一行足够快以获得 0.00 标记。但是,当我更新指定的 Flimzy 和 Searlea 等行的子集时,更新非索引列比更新索引列更快,就像它应该的那样。

如果您想查看结果:

mysql> update a set b = 98;
Query OK, 5000002 rows affected (10.85 sec)
Rows matched: 5000002  Changed: 5000002  Warnings: 0

mysql> update b set b = 98;
Query OK, 4988890 rows affected (1 min 32.69 sec)
Rows matched: 5000001  Changed: 4988890  Warnings: 0

【问题讨论】:

    标签: mysql indexing


    【解决方案1】:

    当然,为每一列建立索引也有缺点。索引越多,写入(INSERT、UPDATE 和 DELETE)所需的时间就越长,因为要写入数据库的内容更多。

    索引只能加快读取的速度。含义,SELECT、DELETE...WHERE 和 UPDATE...WHERE。

    【讨论】:

    • 问题是表 a 的第一列只有一个主键,更新时间是 2.13 秒,而表 b 的三列都有索引需要 0.00 秒。
    • 抱歉,我没有仔细阅读。那么,答案是 WHERE 能够从索引中受益。您没有告诉我们表中有哪些数据,但是如果“c”在每一行中都是唯一的(或者在我们的示例中,您搜索一个不存在的值),那么是的,这样做会更快在这种情况下的索引查询。如果您尝试对所有列进行大规模更新(例如:UPDATE a SET c=c+1),未索引的版本会更快。
    • @searlea 查看问题中的编辑,更改或未更改的行的时间相同(2.xx 秒和 0.00 秒)。
    • 这就是为什么您会看到许多示例在进行大插入/更新之前禁用索引,然后再重新启用它。最后进行一次大规模的索引更新可能比单独进行数以千计的索引更新要快得多。
    • @Flimzy 我现在明白你的意思了。是的,它们使用索引的唯一值,但是在没有索引的批量更新中,5.000.000 行需要 10.85 秒,而使用索引需要 1 分 32.69 秒。现在明白了,谢谢!
    【解决方案2】:

    我假设两个表都包含名为 a、b 和 c 的列,并且它们都是数字的(尽管 c 是字符串化的。)假设 a 是您的主键列,这应该显示两个更新时的基准差异受益于能够找到受影响的行,而表 b 在必须更新索引时应该受到打击:

    update a set b = b + 1 where a between 100000 and 200000;
    update b set b = b + 1 where a between 100000 and 200000;
    

    或者,笼统地说:

    update sane set col2 = col2 + 1 where pk between X and Y;
    

    应该表现得比:

    update fullindexed set col2 = col2 + 1 where pk between X and Y;
    

    【讨论】:

    • 我的问题是表中的每个元组都有一个唯一值,并且更新单个索引和唯一行足够快。但是,当我更新您指定的行子集时,更新非索引列比更新索引列更快,就像它应该的那样。谢谢!
    猜你喜欢
    • 2015-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-06
    • 1970-01-01
    • 2017-02-01
    • 2013-09-30
    • 1970-01-01
    相关资源
    最近更新 更多