2009年5月22日

[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@xxxxx

_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/


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




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