更新具有索引的列值的影响?

时间:2013-10-12 07:48:25

标签: mysql sql innodb

我正在尝试确定MySQL更新索引的情况。说我有下表:

CREATE TABLE MyTable (
  ID INT NOT NULL AUTO_INCREMENT,
  MyIndexedColumn VARCHAR NOT NULL,
  MyNonIndexedColumn VARCHAR,
  PRIMARY KEY (ID),
  INDEX MyNewIndex(MyIndexedColumn)
)

然后我在sql查询中插入一行:

INSERT INTO MyTable (MyIndexedColumn, MyNonIndexedColumn) 
VALUES ('MyTestValue', 'MyTestValue');

现在,如果我运行以下语句,它将更改已编入索引的列的值

UPDATE MyTable 
SET   MyIndexedColumn = 'MyNewIndexValue', 
      MyNonIndexedColumn = 'somenewvalu  New Value' 
WHERE ID = 1;

我总是有这样的查询。很多写(插入/更新)和很少的读取

  1. 这会产生性能问题吗?
  2. 这会将我的索引分段并使它们无法使用吗?
  3. 我怎样才能解决这个问题?
  4. 另外,Oracle会更好还是Mysql可以处理这种数据?

1 个答案:

答案 0 :(得分:0)

Oracle的CREATE TABLE语句有一个选项,可以在这种特定情况下提高操作效率。该选项为PCTFREE

由于row migration,因此在索引中,由于频繁更新,可能会在表内发生碎片。

使用Oracle,您可以使用正确的PCTFREE值来避免这种情况。与InnoDB相比,您可以使用innodb_file_per_table参数最小化副作用,并定期运行OPTIMIZE TABLE来重组数据。