【问题标题】:MySQL slow query at first, fast for sub queriesMySQL起初慢查询,子查询快
【发布时间】:2011-04-28 20:43:44
【问题描述】:

PHP:我有一个简单的分页脚本,它使用两个查询。

MySQL: 使用服务器版本 4.1.25 - 我有两个表(产品、类别),其中 item_num 字段将它们绑定在一起以通过类别检索产品,并且都有唯一的 ID 字段,这些字段被索引和自动递增。它们都是 MyISAM 类型。

查询 #1: SELECT COUNT(*) FROM rituals_collections, rituals_products WHERE rituals_collections.item_num = rituals_products.item_num AND rituals_collections.collection = '$currentCollection' $queryString ORDER BY rituals_products.id

这应该只使用这些过滤器获取记录计数,因此它不需要同时获取数据,从而导致加载时间更长。 $queryString 只是在 URL 中查找任何类别或子类别,如果它们在那里,则将其添加到过滤过程中。 $currentCollection 是用户通过下拉菜单选择的内容。

查询 #2: SELECT DISTINCT * FROM rituals_collections, rituals_products WHERE rituals_collections.item_num = rituals_products.item_num AND rituals_collections.collection = '$currentCollection' $queryString ORDER BY rituals_products.id LIMIT $offset, $rowsperpage

我认为这是瓶颈发生的地方。我需要 DISTINCT 因为管理员无法消除他的重复项。查询的其余部分与 LIMIT $offset,$rowsperpage 相同,它会限制产品以用于分页目的。

数据库截图

我有可用的屏幕截图,但由于我是新用户,我还不能发布它们。我想我以后可以提供给他们。

最后说明:我已将整个脚本包含在此处:http://pastie.org/1239167 由于我的客户使用第 3 方脚本,这两个表设置的位置是不可避免的。而且,这与 MODx CMS 相关,但应该非常简单。

如果有人能提供帮助,我将永远感激不尽。谢谢!

【问题讨论】:

  • 我觉得您正在使用该查询在每一列上查询 DISTINCT。您可以只隔离需要区分的一列吗?
  • 我删除了 DISTINCT 仍然需要很长时间。加载 3,000 条记录需要 20 秒,而加载任何子类别需要不到一秒。如果我只是想获得计数,我是否应该在第一个查询中使用 mysql_num_rows?如果是这样,还有什么替代方案?

标签: mysql performance pagination


【解决方案1】:

事实证明,我在第二个分页查询中有一个不必要的 mysql_num_rows,这大大减少了加载时间。现在,它几乎是即时的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多