我有一个很长时间的查询,我想知道是否有更好的方法来做它?也许可以使用joins?
目前它需要大约2.5秒,这太长了。
稍微解释一下结构:我有产品,“主题”和“类别”。可以为产品分配任意数量的主题或类别。themeitems和category tables表是将类别/主题ID链接到产品ID的链接表。
我想得到一个至少有一个主题和类别的所有产品的列表。我现在得到的查询如下:
SELECT *
FROM themes t, themeitems ti, products p, catitems ci, categories c
WHERE t.ID = ti.THEMEID
AND ti.PRODID = p.ID
AND p.ID = ci.PRODID
AND ci.CATID = c.ID 实际上,我只选择了执行查询时所需的行,但为了进行一点抽象,我删除了这些行。
任何正确方向的帮助都是很棒的!
编辑:如下所示

发布于 2013-09-25 19:07:04
使用正确的连接并确保在连接中使用的字段上有索引是解决此问题的标准答案。
SELECT *
FROM themes t
INNER JOIN themeitems ti ON t.ID = ti.THEMEID
INNER JOIN products p ON ti.PRODID = p.ID
INNER JOIN catitems ci ON p.ID = ci.PRODID
INNER JOIN categories c ON ci.CATID = c.ID 连接的规范帮助查询引擎确定它需要做什么,连接中使用的列上的索引将支持更快速的连接。
发布于 2013-09-25 19:17:03
您的查询很慢,因为您的表上没有任何索引。
尝试:
create unique index pk on themes (ID)
create index fk on themeitems(themeid, prodid)
create unique index pk on products (id)
create index fk catitems(prodid, catid)
create unique index pk on categories (id)由于@symcbean在注释中写道,catitems和themeitems索引可能也应该是唯一的索引-如果没有其他列可以添加到该索引(例如"validityDate"),请将其添加到create语句中。
发布于 2013-09-25 19:07:41
您的查询非常简单。我不认为实现joins会降低您的成本。您可以尝试将索引放到适当的列中
https://stackoverflow.com/questions/19003176
复制相似问题