質問するログイン新規登録

質問編集履歴

3

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

2020/10/21 01:04

投稿

nakatomodesu
nakatomodesu

スコア12

title CHANGED
File without changes
body CHANGED
@@ -48,4 +48,13 @@
48
48
  元々はインデックスが有効となっていたはずなのですが、別件でDBが破損したことにより
49
49
  再構築をしてから、当該事象が発生するようになりました。。
50
50
  環境周りの設定を疑い、以前の状態と比較したのですが、それらしい設定での相違は
51
- 見当たりませんでした...。打つ手がない状況です。
51
+ 見当たりませんでした...。打つ手がない状況です。
52
+
53
+ 2020.10.21追記
54
+ 検証中に、利用しているDBツール(HeidiSQL)で以下の警告が表示されました。(昨日までは出ていなかったんですけど...)
55
+ ```
56
+ Warnings from last query:
57
+ Warning: Cannot use ref access on index 'code' due to type or collation conversion on field 'code'
58
+ ```
59
+ 対象フィールドの型と、変数の方が不一致なので暗黙的な型変換がされてるよ。っていう感じのこと…?
60
+ 確かに変数には型指定していない(できない)ので、納得できるような気もしますが…。

2

そもそもの経緯を追記

2020/10/21 01:04

投稿

nakatomodesu
nakatomodesu

スコア12

title CHANGED
File without changes
body CHANGED
@@ -27,7 +27,21 @@
27
27
 
28
28
  原因として考えられることがあれば、どなたか助言のほどよろしくお願いします。
29
29
 
30
+ ### そもそもの経緯
30
31
 
32
+ 上記は要約した形で記載しておりますが、元々はストアドプロシージャ内で発生した事象になります。
33
+
34
+ 1. cursorを定義(testテーブル)
35
+ 2. select結果を入れる変数を定義
36
+ 3. cursorをオープンしてフェッチ(2の変数に代入しながらループ)
37
+ 4. 任意の処理(データ加工など)
38
+ 5. testテーブルをcodeを指定してupdate ※ここでSQLが遅延
39
+
40
+ 別のセッションからshow processlistで見ると「5」がプライマリーキー指定にも
41
+ かかわらず5秒程度時間がかかっていることが発覚。
42
+ 固定文字に置き換えると再現しなくなったので、変数を条件にしていることが
43
+ 原因と予想し、最初に記載した内容で検証したところ同様の事象が発生。
44
+
31
45
  ### 補足情報
32
46
 
33
47
  MySQLのバージョンは5.7.31です。

1

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

2020/10/20 08:21

投稿

nakatomodesu
nakatomodesu

スコア12

title CHANGED
File without changes
body CHANGED
@@ -4,7 +4,7 @@
4
4
  具体的には以下のような実装となります。
5
5
 
6
6
  set @code = 'XXX'
7
- select * from code = @code
7
+ select * from test where code = @code
8
8
 
9
9
  code列は文字列型で、プライマリーキーです。レコード件数は100万件を超えています。
10
10
  体感で3~5秒程度のレスポンスとなっています。
@@ -13,6 +13,18 @@
13
13
  explainでも変数の場合は全件走査、文字リテラル直接指定だとインデックスが有効と
14
14
  なる結果が返ってきます。
15
15
 
16
+ ** explain 変数利用時 **
17
+ |id|select_type|table|partitions|type|possible_keys|key|key_len|ref|rows|filtered|Extra|
18
+ |:--|:--|:--|
19
+ |1|SIMPLE|test||ALL|||||1756058|100|Using where|
20
+
21
+ ** explain 文字リテラル直接指定時 **
22
+ |id|select_type|table|partitions|type|possible_keys|key|key_len|ref|rows|filtered|Extra|
23
+ |:--|:--|:--|
24
+ |1|SIMPLE|test||const|PRIMARY|PRIMARY|152|const|1|100||
25
+
26
+ ---
27
+
16
28
  原因として考えられることがあれば、どなたか助言のほどよろしくお願いします。
17
29
 
18
30