6

我有一个网络应用程序,每个页面都有很多查询。随着更多数据添加到数据库中,我们注意到页面加载时间越来越长。

在检查 PhpMyAdmin -> Status -> Joins 时,我们注意到了这一点(红色数字):

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

  1. 如何确定导致问题的连接?所有的连接都应该受到同样的指责吗?
  2. 我如何确定应该索引哪些列,以使性能正确?

我们使用的是 CakePHP + MySQL,查询都是自动生成的。

4

2 回答 2

10

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

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

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

t1.name 和 t2.name 都应该被索引。

以下是一些很好的读物:

优化 MySQL:JOIN 顺序的重要性

如何通过索引优化 MySQL JOIN 查询

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

MySQL 优化器团队

编辑:这总是有帮助的。

如果您有权访问服务器设置,请查看:

MySQL 慢速服务器日志

Once you have a log of slow queries, you can use explain on them to see what needs indexing.

于 2012-07-07T17:10:55.927 回答
2

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

你可以试试这个:

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

你也应该试试这个:

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

然后,找到能够提供该价值并访问您不断增长的表的查询。同样,使用EXPLAIN命令查看 MySQL 如何处理它们,并根据需要添加索引。

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

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

于 2012-07-07T15:43:31.397 回答