2009年5月22日

[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@xxxxx>:
> 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@xxxxx
>
> _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
>
>
>
>


投稿者 xml-rpc : 2009年5月22日 09:50
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/85261
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。