Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql sqlfast中链式数据的查询序列_Mysql_Sql_Optimization_Inner Join_Sequence - Fatal编程技术网

Mysql sqlfast中链式数据的查询序列

Mysql sqlfast中链式数据的查询序列,mysql,sql,optimization,inner-join,sequence,Mysql,Sql,Optimization,Inner Join,Sequence,问题: 给出了具有以下结构的表: Table: ID, ID_POINTER, DATA 我想查询此表中的链接数据序列。 如何查询最快的以下“慢速”查询: ? 我的问题: 用表内部联接表替换表、表是否有效?首先,重写查询以使用正确的联接语法。“,”表示“交叉连接”,是一个非常昂贵的操作(或者,有时更糟糕的是,如果其中一个表为空,则可能导致没有行) 使用“,”时,很容易在where子句中出错,造成不良的性能后果 其次,查询优化器应该选择最佳连接路径。然而,要做到这一点,需要更新表上的统计数据。

问题:
给出了具有以下结构的表:

Table:  ID, ID_POINTER, DATA
我想查询此表中的链接数据序列。
如何查询最快的以下“慢速”查询:

?

我的问题:

表内部联接表
替换
表、表
是否有效?

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

使用“,”时,很容易在where子句中出错,造成不良的性能后果

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

第三,您应该经常提到正在使用的数据库,尤其是用于优化的数据库


最后,通过在联接列上建立索引,这样的查询通常(但并非总是)更快。当你有一个选择所有行的一小部分的过滤器时尤其如此。

我想你需要这样的东西

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

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

结果:

ID  IDP DATA
8   9   data6
9   10  data7

您应该在查询中使用正确的连接语法。但是,这可能不会影响性能,除非您在WHERE子句中犯了错误。因此,如果我在所有WHERE条件中进行排列,这将产生不同。比方说,如果我从“表1.DATA=wish DATA 1”开始,依此类推。那我就用左连接试试是MySQL“在联接列上有索引。”??@EwrtWert-除了
WHERE
子句条件表明您实际上有一个内部联接(逻辑上,如果不是实际的话),而不是左联接。使用
LEFT
join不太可能获得正确的(预期的)行为-只需使用常规的连接即可。@x-zero--好的,那么我使用内部连接。我还不熟悉JOIN操作。笛卡尔积对我来说很清楚。但是加入会更快吗?或者对where条件和表进行适当的排序就足够了。基本问题是,我不知道MySQL如何回答查询。@Ewrt-A(n)(
internal
JOIN
的速度更快,只是因为它告诉系统以某种方式限制行,减少了需要执行的工作量(当然,这假设它能够有效地确定它需要哪些行,而这些行通常需要索引)。
JOIN
s是基本SQL操作的一部分-您可能想要一本书(对于基本概念的东西,一般的东西就可以了,任何年龄的人-只需要为数据库特定的东西获取最新的)@x-zero--谢谢。我将使用联接操作重建查询。我将看看它是否更快。我将发布结果。--当我找到时间时,我将尝试了解联接背后的理论及其对性能的影响。
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  IDP DATA
1   2   data1
2   3   data2
3   4   data3
4   5   data4
5   11  data5
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