在 CakePHP 中确定要在 MySQL 中索引哪些列
Posted
技术标签:
【中文标题】在 CakePHP 中确定要在 MySQL 中索引哪些列【英文标题】:Determining which columns to index in MySQL in CakePHP 【发布时间】:2012-07-07 17:49:30 【问题描述】:我有一个网络应用程序,它的每个页面都会触发很多查询。随着更多数据添加到数据库中,我们注意到页面加载时间越来越长。
在检查 phpMyAdmin -> Status -> Joins 时,我们注意到了这一点(红色数字):
Select_full_join 348.6 k 不使用索引的连接数。如果此值不为 0,则应仔细检查表的索引。
-
如何确定导致问题的连接?所有的连接都应该受到同样的指责吗?
如何确定应为哪些列编制索引,以确保性能正常?
我们使用的是 CakePHP + mysql,查询都是自动生成的。
【问题讨论】:
【参考方案1】:如果您不知道哪些查询运行效率低下,您有多种选择。
你可以试试这个:
尝试在您的网站处于活动状态时从 phpmyadmin 发出命令 SHOW FULL PROCESSLIST
。希望它会向您展示一堆运行缓慢的查询。 FULL
进程列表应该为您提供整个查询。然后,您可以使用EXPLAIN
命令找出它在做什么。
你也应该试试这个:
考虑您的应用程序代表您的用户所做的工作。考虑一下您的哪些查询必须通过大量数据才能为用户提供价值。考虑一下随着您的应用程序被越来越多地使用,哪些表正在增长。
然后,找到能够提供该价值并访问您不断增长的表格的查询。同样,使用EXPLAIN
命令查看 MySQL 是如何处理它们的,并根据需要添加索引。
我怀疑应该添加哪些索引会非常明显。添加明显的,然后让您的系统稳定几个工作日,然后重新测量。
请注意,这是将新应用程序投入生产的正常部分。
【讨论】:
SHOW FULL PROCESSLIST 是一个令人难以置信的工具!非常感谢:) +!【参考方案2】:我一直使用的经验法则是,如果我使用 join,我要加入的字段需要被索引。
例如,如果您有如下查询:
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
一旦您有慢查询的日志,您可以对它们使用解释来查看需要索引的内容。
【讨论】:
那么如果我有一个HABTM/Join 表场景,或者一个简单的CakePHP 模型关联场景(比如帖子属于用户,帖子有user_id),那么我会索引哪些字段?这不是一种“隐式”连接吗?抱歉,我完全是新手。 性能方面,显式/隐式连接几乎没有区别。关于在您的 HABTM/Join 中索引哪些字段,我会确保我在连接中使用的任何字段,在您之前的评论的情况下,您的 Posts 表中的 user_id 字段,或者您正在使用的任何内容本质上作为外键。 +1,谢谢。正是我想要的。我有一个应用程序变得非常慢:)以上是关于在 CakePHP 中确定要在 MySQL 中索引哪些列的主要内容,如果未能解决你的问题,请参考以下文章