use*_*_19 5 mysql indexing performance join
我有几个MySQL表 - 这些表有大约300列和1亿行.这些存储日志文件的数据,因此大小.我正在使用InnoDB引擎.很少有涉及这些表的连接的查询显然不起作用.我尝试为这些添加索引,但查询根本没有完成.
我想知道是否有其他方法可以加快性能,或者某种方式使'创建索引'在表上工作?
谢谢.
Bil*_*win 13
创建索引需要时间,与表中的行数成比例.对于MySQL表,1亿行是相当多的.在该表上创建索引可能需要几个小时.根据其他因素(包括服务器硬件,要为其创建索引的列的数据类型,数据库上的其他当前负载等),确切地说有多长时间会有所不同.
可以帮助您的一个工具是pt-online-schema-change.构建索引实际上需要更长的时间,但您可以在工作时继续读取和写入原始表.使用较小的表进行测试,以便您获得使用此工具的一些经验.
您可以在此处查看有关此工具的网络研讨会: MySQL中的零停机模式更改(可免费查看,但需要注册).
另一种方法是创建一个像原始表一样的空表,在该表中创建索引,然后开始逐步将原始表中的数据复制到新表中.如果这是一个日志表,那么您写入表的次数可能比从表中读取的更多,因此您可以立即交换表并立即开始记录新事件,并随着时间的推移进行回填.
像pt-archiver这样的工具可以帮助您逐步复制数据,而不会在服务器上施加太多负载.INSERT INTO... SELECT如果您尝试在一个事务中复制1亿行,那么简单地执行就不利于数据库服务器的运行状况.它还会锁定原始表.pt-archiver一次只复制一小块行,所以它避免了这么大的事务的高成本.
如果使用自动增量主键,在让日志事件开始写入之前,请注意将值调整为高于原始表中的最大值,这样您就不会意外地多次ID值.
使用
 create table newtable like oldtable;
然后将索引应用于newtable,同时为空.
然后
 insert into newtable select * from oldtable;
这可能还需要很长时间才能完成.