mysql:14871
From: "N.K." <"N.K." <nakai.kanako@xxxxxxxxxx>>
Date: Fri, 22 May 2009 09:50:30 +0900
Subject: [mysql 14871] Re: @変数の動作について
私は、結合カラムにはインデックスがついているだろうと想定してインデックスをつけて実施していましたが インデックスなしですと内部的に一時表をつくるので、それが影響しているんじゃないかと思いました。 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 2009/05/22 9:16 柴垣 <akiro@xxxxxxxxxx>: > NKさん、返信ありがとうございます。 > > >> 同一セッションで2回目実行時に期待する結果になっているのは、 >> 前回実行の最後にセットしている"c"が残っているからのようです。 > > > 当初から、mysql> set @code='x'; 等はその都度実行していたのですが、 > 投稿時には抜け落ちてしまっていました。申し訳ありませんでした。 > > メールのコードを私の環境で実行したのですが、やはり以下のように > なります。送っていただいた結果と比較すると、@code の値が違います。 > 抽出と並べ替えの順番が違っているのでしょうか。 > > > set @code=""; > 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 | > | 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 (0.00 sec) > > > こちらの環境は、WindowsXP > mysql Ver 14.12 Distrib 5.0.45, for Win32 (ia32) > Server version:5.0.45-community-nt MySQL Community Edition (GPL) > です。 > > >> ユーザ変数を使用される前に、初期化すると初回実行時でも期待されて >> いる結果にはなりました。 >> >> mysql> set @code="";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; >> Query OK, 0 rows affected >> >> +-------+------+------+------+ >> | @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 > > _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ > > 柴垣 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]