mysql:14872
From: 柴垣 <柴垣 <akiro@xxxxxxxxxx>>
Date: Fri, 22 May 2009 12:06:01 +0900
Subject: [mysql 14872] Re: @変数の動作について
NKさん、重ねてありがとうございます。 なるほど、確かに下記のように、テーブルMにインデックスを つけるだけで、期待した結果になりました。 mysql> alter table M add index codex (code); M側のインデックスだけで、結果が変わるのは不思議な気がしますが、 理由はもう少し考えて見ます。 (追伸:上のインデックスを削除し、alter table T add index codex (code); として、T 側にインデックスをつけても同じ結果になりました。もちろん 両方にインデックスをつけても、同じ期待したとおりの結果です。) > 私は、結合カラムにはインデックスがついているだろうと想定してインデックスをつけて実施していましたが > インデックスなしですと内部的に一時表をつくるので、それが影響しているんじゃないかと思いました。 > > > mysql> set @code=""; > Query OK, 0 rows affected > > mysql> explain > -> select if(T.code=@code,'same','new') as Mark,@code:=T.code as Code,M.name > from T left join M on T.code=M.code order by T.code; > +----+-------------+-------+-------+---------------+------+---------+-------------+------+-------------+ > | id | select_type | table | type | possible_keys | key | key_len | > ref | rows | Extra | > +----+-------------+-------+-------+---------------+------+---------+-------------+------+-------------+ > | 1 | SIMPLE | T | index | NULL | code | 13 | > NULL | 3 | Using index | > | 1 | SIMPLE | M | ref | code | code | 257 | > test.T.code | 2 | | > +----+-------------+-------+-------+---------------+------+---------+-------------+------+-------------+ > 2 rows in set > > mysql> set @code=""; > Query OK, 0 rows affected > > mysql> select @code,if(T.code=@code,'same','new') as > Mark,@code:=T.code as Code,M.name > from T left join M on T.code=M.code order by T.code; > +-------+------+------+------+ > | @code | Mark | Code | name | > +-------+------+------+------+ > | | new | a | ASM | > | a | same | a | ASM | > | a | same | a | ASM | > | a | new | b | BAS | > | b | same | b | BAS | > | b | new | c | COM | > | c | same | c | COM | > +-------+------+------+------+ > 7 rows in set > > > > mysql> set @code=""; > Query OK, 0 rows affected > > mysql> explain > -> select if(T.code=@code,'same','new') as Mark,@code:=T.code as Code,M.name > from T ignore index(code) left join M ignore index(code) on T.code=M.code > order by T.code; > +----+-------------+-------+------+---------------+------+---------+------+------+---------------------------------+ > | id | select_type | table | type | possible_keys | key | key_len | > ref | rows | Extra | > +----+-------------+-------+------+---------------+------+---------+------+------+---------------------------------+ > | 1 | SIMPLE | T | ALL | NULL | NULL | NULL | > NULL | 7 | Using temporary; Using filesort | > | 1 | SIMPLE | M | ALL | NULL | NULL | NULL | > NULL | 3 | | > +----+-------------+-------+------+---------------+------+---------+------+------+---------------------------------+ > 2 rows in set > > mysql> set @code=""; > Query OK, 0 rows affected > > mysql> select @code,if(T.code=@code,'same','new') as > Mark,@code:=T.code as Code,M.name > from T ignore index(code) left join M ignore index(code) on T.code=M.code > order by T.code; > +-------+------+------+------+ > | @code | Mark | Code | name | > +-------+------+------+------+ > | | new | a | ASM | > | b | new | a | ASM | > | b | new | a | ASM | > | a | new | b | BAS | > | c | new | b | BAS | > | a | new | c | COM | > | a | new | c | COM | > +-------+------+------+------+ > 7 rows in set _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ 柴垣 akiro@xxxxxxxxxx _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
14868 2009-05-22 00:44 [柴垣 <akiro@xxxxxxxx] @変数の動作について 14869 2009-05-22 01:44 ┗["N.K." <nakai.kanako] 14870 2009-05-22 09:16 ┗[柴垣 <akiro@xxxxxxxx] 14871 2009-05-22 09:50 ┗["N.K." <nakai.kanako] -> 14872 2009-05-22 12:06 ┗[柴垣 <akiro@xxxxxxxx]