我有一个网络应用程序,每个页面都有很多查询。随着更多数据添加到数据库中,我们注意到页面加载时间越来越长。
在检查 PhpMyAdmin -> Status -> Joins 时,我们注意到了这一点(红色数字):
Select_full_join 348.6 k 不使用索引的连接数。如果此值不为 0,则应仔细检查表的索引。
- 如何确定导致问题的连接?所有的连接都应该受到同样的指责吗?
- 我如何确定应该索引哪些列,以使性能正确?
我们使用的是 CakePHP + MySQL,查询都是自动生成的。
我一直使用的经验法则是,如果我使用 join,我要加入的字段需要被索引。
例如,如果您有如下查询:
SELECT t1.name, t2.salary
FROM employee AS t1
INNER JOIN info AS t2 ON t1.name = t2.name;
t1.name 和 t2.name 都应该被索引。
以下是一些很好的读物:
总的来说,这个人的网站也有一些很好的信息。
编辑:这总是有帮助的。
如果您有权访问服务器设置,请查看:
Once you have a log of slow queries, you can use explain on them to see what needs indexing.
如果您不知道哪些查询运行效率低下,您有几个选择。
你可以试试这个:
SHOW FULL PROCESSLIST
尝试在您的网站处于活动状态时从 phpmyadmin发出命令。希望它会向您展示一堆运行缓慢的查询。FULL
进程列表应该为您提供整个查询。然后,您可以使用该EXPLAIN
命令来确定它在做什么。
你也应该试试这个:
考虑您的应用程序代表您的用户所做的工作。考虑一下您的哪些查询必须通过大量数据才能为用户提供价值。考虑一下随着您的应用程序越来越多地使用哪些表正在增长。
然后,找到能够提供该价值并访问您不断增长的表的查询。同样,使用EXPLAIN
命令查看 MySQL 如何处理它们,并根据需要添加索引。
我怀疑应该添加哪些索引会非常明显。添加明显的,然后让您的系统稳定几个工作日,然后重新测量。
请注意,这是将新应用程序投入生产的正常部分。