非典型查询,必要的索引,优化


select ip.ns, ip.u from iparts ip where ip.isF = 0 and ((ip.wl < ?1 and ip.wl > ?2) or (ip.wf = 0 and ip.c < ?1 and ip.c > ?2))

ip.isf = 0-这部分是最选择性的,95%的记录具有ISF = 1,但是该表确实很大

如何优化此查询?您能澄清一下我应该添加到表 - iparts的索引吗?

以下索引应有助于您的查询:

(`isF`,`wl`)
(`isF`,`wf`,`c`)

添加选定的列将进一步改进它,使这些索引涵盖索引,因此仅允许使用索引,而无需查找主表。

(`isF`,`wl`,`ns`,`u`)
(`isF`,`wf`,`c`,`ns`,`u`)

使用这对索引而不是另一对的唯一缺点是,由于额外的列,插入时间可能会稍慢一些,并且这些索引将占用更多的空间。

我还建议您查询的更改,以充分利用这些索引。

SELECT ip.ns,
ip.u 
FROM iparts ip 
WHERE ip.isF = 0 
AND ip.wl < ?1 
AND ip.wl > ?2
UNION DISTINCT
SELECT ip.ns,
ip.u 
FROM iparts ip 
WHERE ip.isF = 0 
AND ip.wf = 0 
AND ip.c < ?1 
AND ip.c > ?2

通过使用联合,RDBMS可以单独使用适合每个查询的索引进行每个查询。如果确保您的数据在两个查询之间没有重复项,则可以将联盟更改为联合所有的联盟并节省更多时间。

注意:您不需要两对索引。我建议尝试第一对(较短的(,看看性能是否可以接受(请确保使用我的查询。(如果它不够好,请丢下这些并添加第二对。

如果您需要更多帮助,请在您的问题中添加SHOW CREATE TABLE iparts的输出。这将使我们看到现有的索引和列数据类型,这两者都与任何优化有关。

最新更新