我正在阅读这个问题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
答案 0 :(得分:2)
当然,索引每列都有缺点。使用更多索引时,写入(INSERT,UPDATE和DELETE)需要更长时间,因为要写入数据库还有更多内容。
索引只能加快读取的速度。含义,SELECT,DELETE ... WHERE和UPDATE ... WHERE。
答案 1 :(得分:1)
我假设两个表都包含名为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;