在 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 中索引哪些列的主要内容,如果未能解决你的问题,请参考以下文章

cakephp: 警告 (2): mysql_connect()

MySQL索引的基本理解

CakePHP 从 URL 中删除索引操作

在 CakePHP 中无法使用 MySQL

如何在 CakePHP 中使用自定义 MySQL 查询?

CakePHP 2.0 确定点击了哪个提交按钮