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

mysql:15730

From: "ochiai" <"ochiai" <s.ochiai@xxxxxxxxxx>>
Date: Fri, 13 Apr 2012 10:32:27 +0900
Subject: [mysql 15730] Re: Left Join句を付けたUPDATE処理時間が非常に長くかかって(解決御礼)

中川様、平塚様

ありがとうございます。
私も先の返信をした後、キャラクタセットの不統一が影響しているかもしれない
と思い、、
ALTERでテーブルのデフォルトキャラクタセットをCP932に変更し、再度、
explainで様子を見ました。
結果は、変わりませんでした。

そこで、念のため、show create tableでテーブル定義を見たところ、
テーブルのデフォルトキャラクタセットはCP932に変更されていましたが、
varcharの各フィールドの定義にutf8が追加されていました。
既にデータが入っているフィールドのキャラクタセットは変更できないのかもし
れません。

そこで、最初からテーブルを作り直して、explainで様子をみました。
結果は、望んでいた結果となりました。
+----+-------------+---------+--------+---------------+-----------+---------+-----------------+--------+-------+

| id | select_type | table | type | possible_keys | key | key_len | ref
| rows | Extra |
+----+-------------+---------+--------+---------------+-----------+---------+-----------------+--------+-------+

| 1 | SIMPLE | table-a | ALL | NULL | NULL | NULL | NULL | 220419 | |
| 1 | SIMPLE | table-b | eq_ref | F1_UNIQUE | F1_UNIQUE | 62 |
test.table-a.F1 | 1 | |
+----+-------------+---------+--------+---------------+-----------+---------+-----------------+--------+-------+


実際に、これでUPDATEを行ったところ、1分程度で処理が完了しました。

平塚様には、詳しい解説をいただき、納得しました。
キャラクタセットが異なる場合、暗黙のうちにCASTしてくれているとは、よく考えられていますね。
ところで、平塚さんの解説のような情報はどこにあるのでしょうか?よろしければ教えてください。

今回の教訓:デフォルトキャラクタセットはスキーマ単位で設定すると良い。

ありがとうございました。


(2012/04/11 18:24), 中川 貴 wrote:
> 確信はありませんが、これが影響している可能性はあります。
> 私も日本郵政の郵便番号辞書のデータでutf8とcp932のテーブルを作成してJOINしてみましたが副次キーの場合、
> ジョインに索引が使われませんでした。
> なぜだか分かりませんが、主キー同士の場合refに「func」表示が現れます。この場合、実際にどんな動作を
> しているかは分かりません。
> 試しに、charasetをcp932に合わせた環境でもう一度試して見てください。
>
> ****************************************
> コープ情報システム株式会社
> 運用事業部
> コーププラザサービスデスクグループ
> 中川 貴
> 175-0094
> 東京都渋谷区渋谷3-29-8 コーププラザ5F
> TEL 03-5778-8010
> E-MAIL takashi.nakagawa@xxxxxxxxxx
> ****************************************
>
> (2012/04/11 17:03), ochiai wrote:
>> 今気づいたことですが、手違いでtable-aとtable-bのキャラクタセットが異なっていました。本来はcp932で統一します。
>> これは影響するでしょうか?
>
>



----- Original Message ----- 
From: "HIRATSUKA Sadao" <hiratsuka.sadao@xxxxxxxxxx>
To: <ml@xxxxxxxxxx>
Sent: Thursday, April 12, 2012 9:46 AM
Subject: [mysql 15729] Re: Left Join句を付けたUPDATE処理時間が非常に長くかかって(長文)


> おはようございます、平塚です。
>
> On Wed, 11 Apr 2012 18:24:05 +0900
> 中川 貴<takashi.nakagawa@xxxxxxxxxx> wrote:
>
>> 確信はありませんが、これが影響している可能性はあります。
>> 私も日本郵政の郵便番号辞書のデータでutf8とcp932のテーブルを作成して
>> JOINしてみましたが副次キーの場合、
>> ジョインに索引が使われませんでした。
>
> (2012/04/11 17:03), ochiai wrote:
>
>> > 今気づいたことですが、手違いでtable-aとtable-bのキャラクタセットが
>> > 異なっていました。本来はcp932で統一します。
>> > これは影響するでしょうか?
>
> こちらでも再現しました。
> 原因は中川さんのおっしゃる通りで間違いないと思います。
> 解決策としては、キャラクタセットを統一してください。
>
> ==
>
> 以下解説です。
>
> FROM ta LEFT JOIN tb ON ta.c1 = tb.c1
>
> というSQLにおいてtaがutf8、tbがcp932の場合、
> 内部的に以下のような変換が行われ、utf8同士での比較となります。
>
> ta.c1 = CAST(tb.c1 AS CHAR CHARACTER SET utf8)
>
> tb.c1に対して関数を適用しているため、
> tb.c1にインデックスがあっても使えなくなります。
>
> --
>
> もし問題のSQLがINNER JOINであれば、
> tbを駆動表としてta.c1のインデックスを使う
> 次善のSQL実行計画になった可能性があります。
>
> しかしLEFT JOINですと
> tbに該当なしのデータも引き抜いてくる必要があるため
> taを駆動表としたSQL実行計画しか選べず、
> フルスキャンやむなしとなります。
>
> --
>
> また、taがcp932、tbがutf8という逆のパターンでは
>
> CAST(ta.c1 AS CHAR CHARACTER SET utf8) = tb.c1
>
> となるため、taが駆動表である場合に
> tb.c1のインデックスを使うことができます。
>
> このときtbのrefに「func」が現れます。
> ta.c1にfuncを適用したものとtb.c1をJOINするという意味です。
>
> --
>
> おまけでtaがcp932、tbがeucjpmsの場合は、
> 暗黙のキャラクタセット変換ができずエラーとなります。
>
> ERROR 1267 (HY000): Illegal mix of collations
> (cp932_japanese_ci,IMPLICIT) and (eucjpms_japanese_ci,IMPLICIT)
> for operation '='
>
> 暗黙のキャラクタセット変換ができるのは、調べた限り
> cp932   → utf8
> eucjpms → utf8
> utf8    → utf8mb4
> などutf8に向かう方向のみのようです。(latin1 → cp932は不可)
>
> -- 
> 平塚貞夫 hiratsuka.sadao@xxxxxxxxxx
>
>
>
>
> 




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

     15703 2012-03-29 15:08 ["ochiai" <s.ochiai@x] Left Join句を付けたUPDATE処理時間が非常に長くかかって
     15705 2012-03-29 16:56 ┣[中川 貴 <takashi.nak]                                       
     15706 2012-03-29 17:01 ┗[中川 貴 <takashi.nak]                                       
     15707 2012-03-29 17:12  ┗[中川 貴 <takashi.nak]                                     
     15708 2012-03-29 17:42   ┗["ochiai" <s.ochiai@x]                                   
     15709 2012-03-29 17:46    ┣[中川 貴 <takashi.nak]                                 
     15711 2012-03-29 17:58    ┃┗["ochiai" <s.ochiai@x]                               
     15712 2012-03-29 20:25    ┃ ┣[HIRATSUKA Sadao <hir]                             
     15713 2012-03-30 01:27    ┃ ┗[中川貴 <nora1962@xxx]                             
     15727 2012-04-11 17:03    ┃  ┗["ochiai" <s.ochiai@x] Re: Left Join句を付けたUPDATE処理時間が非常に長くかかって(長文)
     15728 2012-04-11 18:24    ┃   ┗[中川 貴 <takashi.nak]                         
     15729 2012-04-12 09:46    ┃    ┗[HIRATSUKA Sadao <hir]                       
->   15730 2012-04-13 10:32    ┃     ┗["ochiai" <s.ochiai@x] Re: Left Join句を付けたUPDATE処理時間が非常に長くかかって(解決御礼)
     15733 2012-04-13 11:13    ┃      ┗[HIRATSUKA Sadao <hir]                   
     15710 2012-03-29 17:47    ┗[Masaaki Matsuyama <m]