对大表添加MySQL索引的性能影响

时间:2017-02-21 12:11:52

标签: mysql database database-design database-performance database-administration

我们想为字段3&添加正常索引。 4 以下MySQL表,并希望了解在执行此操作之前对服务器性能的影响。例如。因此,索引会占用额外的RAM并减慢数据库的速度吗?

我们知道最初创建索引需要时间。我们并不关心这一点。相反,我们想知道是否需要升级我们的服务器以预测添加索引后数据库的加载/内存压力可能增加。我们的dba坚持认为我们必须将RAM从16GB增加到48GB,因为他认为新索引将保留在RAM中,导致服务器耗尽内存用于其他操作。很高兴确认是否有必要。

提前感谢您的专业建议。

MySQL版本:5.5.30

操作系统:CentOS

硬件配置:8核,32G RAM,1TB磁盘

表格大小:490GB

没有。行:67M

CREATE TABLE `mytable` (
  `field_1` text NOT NULL,
  `field_2` varchar(200) NOT NULL,
  `field_3` varchar(100) NOT NULL,
  `field_4` text NOT NULL,
  `field_5` char(8) NOT NULL,
  `field_6` varchar(100) NOT NULL DEFAULT '',
  `field_7` varchar(100) DEFAULT '',
  `field_8` varchar(20) NOT NULL,
  `field_9` char(16) NOT NULL,
  `field_0` varchar(25) NOT NULL,
  `field_a` varchar(50) NOT NULL DEFAULT '',
  `field_b` varchar(20) DEFAULT '',
  `field_c` varchar(35) DEFAULT '',
  `field_d` varchar(35) DEFAULT '',
  `field_e` varchar(30) NOT NULL DEFAULT '',
  `field_f` varchar(30) DEFAULT '',
  `field_g` varchar(3) NOT NULL DEFAULT 'xx',
  `field_h` varchar(50) DEFAULT '',
  `field_i` varchar(100) DEFAULT '',
  `field_j` char(8) NOT NULL,
  `field_k` varchar(10) NOT NULL DEFAULT '',
  `field_l` datetime NOT NULL,
  PRIMARY KEY (`field_9`),
  KEY `field_j_idx` (`field_j`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

1 个答案:

答案 0 :(得分:0)

这取决于。你有什么版本的MySQL?对于较新的版本,ALGORITHM=INPLACE可以相对快速且无痛地添加次要的,非唯一的索引。

你还有另一个潜在的问题迫在眉睫。如果此表的大小实际上是磁盘大小的一半,如果确实需要使用ALTER无法执行的INPLACE,则可能因磁盘空间不足而崩溃。考虑在此之前获取更大的磁盘,和/或考虑缩小表的方法。

CHAR(8) - 其中包含哪些数据?如果它总是十六进制或普通字母,则应声明CHARACTER SET ascii(或latin1),而不是utf8 - 这需要24个字节。由于索引,Field_j已经加倍了。

如果某些列具有重复值,请考虑"标准化"他们。然后用MEDIUMINT UNSIGNED(3个字节,最大16M)或INT UNSIGNED替换庞大的字符串。

(我理解你需要对列名进行模糊处理,但这很难给你提供具体的建议。)

field_4TEXT,无法编入索引。请进一步说明其中的文字类型;我们或许可以建议解决方法。

我在构建表格时假设innodb_file_per_table=ON?还是ON?否则,所有的希望都会消失。