在CakePHP中确定要在MySQL中索引的列

时间:2012-07-07 15:31:08

标签: mysql database cakephp join indexing

我有一个网络应用,每个网页都会触发相当多的查询。随着更多数据被添加到数据库中,我们注意到页面的加载时间越来越长。

检查PhpMyAdmin - >状态 - >加入,我们注意到了这一点(红色数字):

Select_full_join 348.6 k不使用索引的联接数。如果此值不为0,则应仔细检查表的索引。

  1. 如何确定导致问题的连接?是否所有的联接都受到指责?
  2. 如何确定哪些列应编入索引,以确保性能正常?
  3. 我们正在使用CakePHP + MySQL,并且所有查询都是自动生成的。

2 个答案:

答案 0 :(得分:9)

我一直使用的经验法则是,如果我使用连接,我加入的字段需要编入索引。

例如,如果您有如下查询:

SELECT t1.name, t2.salary
    FROM employee AS t1 
    INNER JOIN info AS t2 ON t1.name = t2.name;

t1.name和t2.name都应编入索引。

以下是一些很好的读物:

Optimizing MySQL: Importance of JOIN Order

How to optimize MySQL JOIN queries through indexing

总的来说,这家伙的网站也有一些很好的信息。

MySQL Optimizer Team

编辑:这总是有用的。

如果您可以访问服务器设置,请查看:

MySQL Slow Server Logs

一旦你有一个慢查询的日志,你可以使用解释来查看需要索引的内容。

答案 1 :(得分:2)

如果您不知道哪些查询运行效率低下,您有几个选择。

你可以试试这个:

尝试在您的网站处于活动状态时从phpmyadmin发出命令SHOW FULL PROCESSLIST。希望它会向您显示一堆运行缓慢的查询。 FULL进程列表应该为您提供整个查询。然后,您可以使用EXPLAIN命令来确定它正在做什么。

你也应该试试这个:

考虑您的应用程序代表您的用户所做的工作。想一想您的哪些查询必须通过大量数据来为用户提供价值。随着您的应用程序越来越多地被使用,请考虑哪些表正在增长。

然后,找到提供该值的查询,并访问正在增长的表。再次,使用EXPLAIN命令查看MySQL如何处理它们,并根据需要添加索引。

我怀疑你应该添加哪些索引非常明显。添加明显的,然后让您的系统稳定几个工作日,然后重新测量。

请注意,这是将新应用程序投入生产的正常部分。