【问题标题】:Query: Select products from master- and subcategories查询:从主类别和子类别中选择产品
【发布时间】:2015-02-15 03:59:53
【问题描述】:

我需要在一个查询中从一个主类别及其所有子类别中选择产品。

我有 3 个表:项目、类别、项目类别(包含项目和类别之间的链接)。我的类别有左值和右值 (Wikipedia: Nested set model)。

我对 leftCount 5 和 rightCount 58 的主类别的查询:

SELECT i.* FROM itemCategories ic, categories c, items i 
WHERE i.isActive = '1' AND i.isHidden = '0' 
AND ic.itemId = i.id AND ic.categoryId = c.id 
AND c.leftCount BETWEEN 5 AND 58
ORDER BY i.sortingValue, i.name

我有大约 16.000 种产品,上面的查询将列出大约。其中 50%。据我所知,这应该是一个简单的操作,但查询大约需要 0.1100 秒。

索引已到位:

  • leftCount in categories
  • isActive 和 isHidden 在项目中
  • itemCategories 中的 itemId 和 categoryId

您有什么性能建议吗?

更新

当我删除 ORDER BY 时,查询时间减少到 0.0007 秒。所以我想时间都花在对临时表进行排序上。是否有任何性能提升器可以帮助实现这一点?

【问题讨论】:

  • 出于好奇,为什么认为 110 毫秒很慢?
  • 我不确定它是否很慢,但与我的其他操作相比,它肯定要慢得多。所以我希望有人知道实现我目标的更好方法。真正的查询也有一些左连接,这会进一步减慢它。

标签: mysql


【解决方案1】:

categories.idcategories.leftCount 上放置BTREE 索引:

ALTER TABLE categories ADD INDEX myIXD USING BTREE (id, leftCount)

【讨论】:

  • 请给我们看全图,我不想猜测现有的东西
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多