我有一个网络应用,每个网页都会触发相当多的查询。随着更多数据被添加到数据库中,我们注意到页面的加载时间越来越长。
检查PhpMyAdmin - >状态 - >加入,我们注意到了这一点(红色数字):
Select_full_join 348.6 k不使用索引的联接数。如果此值不为0,则应仔细检查表的索引。
我们正在使用CakePHP + MySQL,并且所有查询都是自动生成的。
答案 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
总的来说,这家伙的网站也有一些很好的信息。
编辑:这总是有用的。
如果您可以访问服务器设置,请查看:
一旦你有一个慢查询的日志,你可以使用解释来查看需要索引的内容。
答案 1 :(得分:2)
如果您不知道哪些查询运行效率低下,您有几个选择。
你可以试试这个:
尝试在您的网站处于活动状态时从phpmyadmin发出命令SHOW FULL PROCESSLIST
。希望它会向您显示一堆运行缓慢的查询。 FULL
进程列表应该为您提供整个查询。然后,您可以使用EXPLAIN
命令来确定它正在做什么。
你也应该试试这个:
考虑您的应用程序代表您的用户所做的工作。想一想您的哪些查询必须通过大量数据来为用户提供价值。随着您的应用程序越来越多地被使用,请考虑哪些表正在增长。
然后,找到提供该值的查询,并访问正在增长的表。再次,使用EXPLAIN
命令查看MySQL如何处理它们,并根据需要添加索引。
我怀疑你应该添加哪些索引非常明显。添加明显的,然后让您的系统稳定几个工作日,然后重新测量。
请注意,这是将新应用程序投入生产的正常部分。