我在MyISAM数据库上运行大约50,000个查询但是查询运行的时间越长,查询就越慢。例如,在开始时,可以在一秒内完成20行,最后它每秒执行5行。这是因为MyISAM在每次插入后锁定表还是其他原因?
我认为我必须使用MyISAM,因为我对全文索引使用了match()和(),据我所知只有MyISAM支持。是否可以使用InnoDB或其他具有此功能的数据库类型,或者有一种方法可以加快查询速度,因为当前查询的执行时间大约为45分钟。
我期待很多关于我的查询结构的答案,我正在将三个不同列的表格合并到一个表中,并尝试将3个不同的行匹配在一起形成一个“超级”,因此我需要做很多事情match()对(),preg_match,选择和循环,以便与精确匹配。为了优化我的循环,我正在使用带有预处理语句的PDO,但这只是将查询时间缩短到我上面提到的时间,使用mysql_connect和标准函数它接近一个小时。
请记住,查询开始时并不慢,只有在完成大约10,000次查询之后,它才会明显减慢并且随着它越来越多它变得越来越慢,直到它达到任何服务器公司接受的不合理级别,有谁给我一个解决方案?
答案 0 :(得分:0)
我的建议是尝试更新你的MySQL,
如果你有大量的MySQL -V 5.6+写入允许你在InnoDB表中使用全文索引,那么除了Innodb允许你锁行以便这是一个巨大的事情。
您还可以尝试使用ANALIZE
修复索引,这可能有助于提高性能
答案 1 :(得分:0)
MySQL全文搜索无法通过设计有效处理大数据。从MyISAM切换到InnoDB大多数时候都是好主意,因为它有助于非FT查询性能和并发性,并且会在InnoDB支持事务时保证数据安全,但不会提高FT查询速度(根据Percona的基准测试) http://bit.ly/M6DMsj)。
我建议将全文查询移出MySQL。在这种情况下,任何像Solr或Sphinx这样的外部搜索引擎都会非常有用。
我不是Solr的专家,但如果您决定使用Sphinx,可以使用http://astellar.com/2011/12/replacing-mysql-full-text-search-with-sphinx/作为初始配置的指南。
希望这有帮助。