MySQL大表查询非常慢

MySQL大表查询非常慢,mysql,Mysql,我有一个MySQL表AdsPOI,它的结构如下: AdsPOIId (bigint 20) PRIMARY, AUTO INCREMENT Distance (int 6) not indexed poi_POIId (bigint 20) INDEXED, references another table POI ads_AdId (bigint 20) INDEXED, references another table Ads 在这个表中,目前约有7.000.000行,但每分

我有一个MySQL表AdsPOI,它的结构如下:

 AdsPOIId  (bigint 20) PRIMARY, AUTO INCREMENT
 Distance  (int 6) not indexed
 poi_POIId (bigint 20) INDEXED, references another table POI
 ads_AdId  (bigint 20) INDEXED, references another table Ads
在这个表中,目前约有7.000.000行,但每分钟都在增长,越来越大。该表是一个InnoDB表。即使我尝试对表进行最简单的查询,例如:通过ads_AdId从AdsPOI ORDER中选择*时,查询运行大约需要20秒。当我尝试一个更复杂的查询时,比如从AdsPOI中选择poi POID,其中ads AdId>5和ads AdId<300000 GROUP BY poi POID,查询大约需要1分20秒,返回大约130000行


有没有办法加快这些疑问?这些查询运行得这么慢是正常的吗?如何使它们更快?

您可以尝试通过增加innodb_buffer_pool_大小来优化磁盘I/O,从而将最近访问的表移动到RAM中


使用关系数据库和大量数据,您只能做这么多事情。如果在一个正确索引的表中已经有数百万个条目,并且它的增长速度很快,那么可以预期查询会变得更慢。添加更强大的硬件是一种选择


如果您可以在没有外键关系的情况下生活,那么针对海量数据优化的大数据NoSQL工具(如MongoDB)可能是更好的设计选择。

您知道InnoDB默认配置为使用8MB的RAM吗?如果它不能使用RAM在那里存储其工作数据集,它将使用磁盘进行搜索。找到数据的速度很慢。查找此配置变量的值:innodb_buffer_pool_size并将其增加到.cnf文件中,但您可以使用诸如“%buffer_pool%”之类的显示变量查询该值;。innodb_缓冲区_池_大小为134217728。这个值是以字节为单位的吗?也就是说,它是128MB。我试着增加它。是的,以字节为单位。通常,对于数据库服务器,我个人使用80%到90%的可用RAM,但是,我们运行的服务器具有32gb或更多的RAM。为InnoDB分配的资源越多越好。这样就避免了磁盘I/O,查找数据的速度也更快了。@草莓,为什么这毫无意义?poi_poid不是唯一的。我的意思是,多个AdId可以有相同的poi_poidok,这不是荒谬的-而且令人恼火的是,使用groupby而不是DISTINCT会带来性能上的好处。但是,通常情况下,GROUPBY用于聚合函数,DISTINCT用于所有其他情况。你完全错了。你认为NoSQL有一些神奇的算法,可以让它更好地利用计算机资源,而开发关系数据库的人是愚蠢的,从来没有想过它们?