我有大量的数据。我在MySQL表中加载的超过40 in。我正在尝试执行像select * from tablename这样的简单查询,但是运行它需要花费很长的时间,并最终超时。如果我设置了一个限制,那么执行是相当快的-- ex:select * from tablename limit 1000。该表有2亿多项记录。
对于使用这些类型的数据集有什么建议吗?
发布于 2015-05-01 16:01:49
对于大型数据库,应该考虑使用另一种解决方案,如Apache。MySQL从磁盘读取数据,这是一个缓慢的操作。没有什么比基于MapReduce的技术工作得更快了。看看this answer。的确,对于大型数据库来说,查询非常具有挑战性。
无论如何,假设您想坚持使用MySQL,首先,如果使用MyISAM,请确保将数据库存储转换为InnoDB。如果您有大量的读/写操作,这一点尤其重要。
对表进行分区也很重要,这样可以将表简化为更易于管理的更小的表。它还将提高索引的性能。
在添加索引时不要太慷慨。明智地定义索引。如果索引不需要是UNIQUE,请不要将其定义为索引。如果索引不需要包含多个字段,则不要包含多个字段。
最重要的是,启动监视您的MySQL实例。使用SHOW ENGINE INNODB STATUS调查MySQL实例的性能。
发布于 2015-05-01 16:28:52
您需要做的第一件事是,完全忽略--所有的答案和评论--给出一些其他令人敬畏的、莫名其妙的技术建议。绝对是胡说八道。这些东西不能以不同的方式工作,因为它们都受到相同问题的约束--硬件。
现在,让我们回到MySQL。LIMIT的问题是,MySQL获取整个数据集,然后从OFFSET开始获取LIMIT的行数。这意味着如果您执行SELECT * FROM my_table LIMIT 1000 -它将占用所有2亿行,缓冲它们,然后它将开始计数从0到999,并丢弃其余的。
是的,这需要时间。是的,它看起来很蠢。然而,MySQL不知道什么是“开始”或“结束”,所以它不知道什么是限制和偏移,直到你告诉它。
为了改进搜索,您可以使用类似的内容(假设您有数字主键):
SELECT * FROM tablename WHERE id < 10000 LIMIT 1000;在这种情况下,MySQL将处理PK低于10 000的所有行,而不是2亿行。更容易,更快,也更易读。可以随时调整数字,如果您在脚本语言中执行某种类型的分页,则始终可以传递当前的最后一个数字id,这样MySQL就可以在搜索时从该id开始。
另外,您应该使用InnoDB引擎,并使用innodb_buffer_pool_size对其进行微调,这是使MySQL飞起来的神奇酱汁。
https://stackoverflow.com/questions/29990165
复制相似问题