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

mysql:15729

From: HIRATSUKA Sadao <HIRATSUKA Sadao <hiratsuka.sadao@xxxxxxxxxx>>
Date: Thu, 12 Apr 2012 09:46:24 +0900
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]