0

问题:
给定的是具有以下结构的表:

Table:  ID, ID_POINTER, DATA

我想在这个表中查询一个链式数据序列。
如何以最快的速度查询以下“慢”查询:

SELECT * FROM Table 1, ...., Table n WHERE
Table 1.ID = TABLE 2.ID_POINTER and .........  and TABLE n-1.ID = Table n.ID_POINTER
and Table 1.DATA = wish data 1  AND .......... AND Table n.DATA = wish data n

?

我的问题:
替换Table , Table为有效Table INNER JOIN Table吗?

4

2 回答 2

0

我认为你需要像这样的 SQLFIDDLE

SELECT ID ,@pv:=ID_POINTER AS IDP, DATA FROM test
JOIN
(SELECT @pv:=1)tmp
WHERE ID=@pv

CREATE TABLE IF NOT EXISTS `test` (
  `ID` int(8) unsigned NOT NULL ,
  `ID_POINTER` int(8) unsigned NOT NULL,
  `DATA` varchar(128)  NOT NULL
) ENGINE=InnoDB  DEFAULT CHARSET=latin1  ;

INSERT INTO `test` VALUES(1,2,"data1"),
(2,3,"data2"),
(3,4,"data3"),
(4,5,"data4"),
(5,11,"data5"),
(8,9,"data6"),
(9,10,"data7");

结果:对于 id = 1(在查询中检索 id 1 集@pv:=1的链式数据)

ID  IDP DATA
1   2   data1
2   3   data2
3   4   data3
4   5   data4
5   11  data5

对于 id = 8(在查询中检索 id 8 集@pv:=8的链式数据)

SELECT ID ,@pv:=ID_POINTER AS IDP, DATA FROM test
JOIN
(SELECT @pv:=8)tmp
WHERE ID=@pv

结果:

ID  IDP DATA
8   9   data6
9   10  data7
于 2013-11-28T10:37:41.190 回答
0

首先,重写查询以使用正确的连接语法。“,”表示“交叉连接”,是一项非常昂贵的操作(或者,有时更糟糕的是,如果其中一个表为空,可能会导致没有行)。

使用“,”时,在 where 子句中很容易出错,从而导致性能下降。

其次,查询优化器应该选择最佳连接路径。但是,要做到这一点,需要更新表的统计信息。因此,请确保您已更新统计信息(这因数据库而异)。

第三,您应该始终提及正在使用的数据库,尤其是在优化方面。

最后,通过在连接列上设置索引,此类查询通常(但并非总是)更快。当您有一个选择所有行的一小部分的过滤器时尤其如此。

于 2012-08-13T20:18:38.373 回答