【问题标题】:Determining which columns to index in MySQL in CakePHP在 CakePHP 中确定要在 MySQL 中索引哪些列
【发布时间】:2012-07-07 17:49:30
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: mysql database cakephp join indexing


    【解决方案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,谢谢。正是我想要的。我有一个应用程序变得非常慢:)
    猜你喜欢
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 2017-05-05
    • 1970-01-01
    • 2013-02-26
    • 1970-01-01
    • 1970-01-01
    • 2019-10-03
    相关资源
    最近更新 更多