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