[前][次][番号順一覧][スレッド一覧]

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]