質問編集履歴

3

検証を進めていたら警告が出たので追記

2020/10/21 01:04

投稿

nakatomodesu
nakatomodesu

スコア12

test CHANGED
File without changes
test CHANGED
@@ -99,3 +99,21 @@
99
99
  環境周りの設定を疑い、以前の状態と比較したのですが、それらしい設定での相違は
100
100
 
101
101
  見当たりませんでした...。打つ手がない状況です。
102
+
103
+
104
+
105
+ 2020.10.21追記
106
+
107
+ 検証中に、利用しているDBツール(HeidiSQL)で以下の警告が表示されました。(昨日までは出ていなかったんですけど...)
108
+
109
+ ```
110
+
111
+ Warnings from last query:
112
+
113
+ Warning: Cannot use ref access on index 'code' due to type or collation conversion on field 'code'
114
+
115
+ ```
116
+
117
+ 対象フィールドの型と、変数の方が不一致なので暗黙的な型変換がされてるよ。っていう感じのこと…?
118
+
119
+ 確かに変数には型指定していない(できない)ので、納得できるような気もしますが…。

2

そもそもの経緯を追記

2020/10/21 01:04

投稿

nakatomodesu
nakatomodesu

スコア12

test CHANGED
File without changes
test CHANGED
@@ -56,6 +56,34 @@
56
56
 
57
57
 
58
58
 
59
+ ### そもそもの経緯
60
+
61
+
62
+
63
+ 上記は要約した形で記載しておりますが、元々はストアドプロシージャ内で発生した事象になります。
64
+
65
+
66
+
67
+ 1. cursorを定義(testテーブル)
68
+
69
+ 2. select結果を入れる変数を定義
70
+
71
+ 3. cursorをオープンしてフェッチ(2の変数に代入しながらループ)
72
+
73
+ 4. 任意の処理(データ加工など)
74
+
75
+ 5. testテーブルをcodeを指定してupdate ※ここでSQLが遅延
76
+
77
+
78
+
79
+ 別のセッションからshow processlistで見ると「5」がプライマリーキー指定にも
80
+
81
+ かかわらず5秒程度時間がかかっていることが発覚。
82
+
83
+ 固定文字に置き換えると再現しなくなったので、変数を条件にしていることが
84
+
85
+ 原因と予想し、最初に記載した内容で検証したところ同様の事象が発生。
86
+
59
87
 
60
88
 
61
89
  ### 補足情報

1

explainの結果を追記しました。

2020/10/20 08:21

投稿

nakatomodesu
nakatomodesu

スコア12

test CHANGED
File without changes
test CHANGED
@@ -10,7 +10,7 @@
10
10
 
11
11
  set @code = 'XXX'
12
12
 
13
- select * from code = @code
13
+ select * from test where code = @code
14
14
 
15
15
 
16
16
 
@@ -25,6 +25,30 @@
25
25
  explainでも変数の場合は全件走査、文字リテラル直接指定だとインデックスが有効と
26
26
 
27
27
  なる結果が返ってきます。
28
+
29
+
30
+
31
+ ** explain 変数利用時 **
32
+
33
+ |id|select_type|table|partitions|type|possible_keys|key|key_len|ref|rows|filtered|Extra|
34
+
35
+ |:--|:--|:--|
36
+
37
+ |1|SIMPLE|test||ALL|||||1756058|100|Using where|
38
+
39
+
40
+
41
+ ** explain 文字リテラル直接指定時 **
42
+
43
+ |id|select_type|table|partitions|type|possible_keys|key|key_len|ref|rows|filtered|Extra|
44
+
45
+ |:--|:--|:--|
46
+
47
+ |1|SIMPLE|test||const|PRIMARY|PRIMARY|152|const|1|100||
48
+
49
+
50
+
51
+ ---
28
52
 
29
53
 
30
54