对于具有非常大的表的MySQL,“SHOW INDEX”是否缓慢/有问题

时间:2011-11-23 11:02:55

标签: mysql ruby-on-rails ruby-on-rails-3 performance indexing

我们在Debian上使用MySQL 5.0.51。我有一个大型数据库(一个表上超过8000万行,另一个表上超过3000万行,另一个上有2000万行等,每个都有一个整数主键,大多数表都相当宽),服务器正在工作相当难。

我们正在使用的框架(Ruby on Rails)有made a minor tweak,这导致了真正的问题,我正在试图看看它是否会影响我们,或者它是否是内在的类型查询它正在做什么。

在启动新的Rails进程时,框架为每个表(即InnoDB)运行“SHOW INDEX FROM foo WHERE Key_name ='PRIMARY'”。在我们的服务器上,并且取决于更大的表占用5到15秒的负载/其他查询。这相当于很多秒。

这是预期的行为,还是仅在某些有限的情况下发生,并且是否有任何解决方案(可能是使用“SHOW CREATE TABLE foo”来获取相同的信息)。

2 个答案:

答案 0 :(得分:0)

不,它不应该慢。我刚刚在一张大约有4000万行的桌子上试过它,花了不到0.1秒。

SHOW INDEX应仅提供表统计信息中已有的信息。 我唯一能想到的是,如果没有关于表的统计信息,mysql内部调用ANALYZE TABLE,但我希望不会,那将是非常糟糕的。

答案 1 :(得分:0)

我们在Rails 3.1中遇到了同样的问题。问题是如果后面的表没有主键,则为ActiveRecord操作调用SHOW INDEX的次数太多。你说你的表有主键,但有些属性是ActiveRecord不理解的吗?

我提出了解决我们没有主键的问题的拉取请求,所以也许你会从那里找到答案。

https://github.com/rails/rails/pull/3812