質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

2回答

759閲覧

MySQLのインデックスがうまく効かない

siosenbei

総合スコア22

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

0クリップ

投稿2019/08/26 03:59

このクエリならば、sc_idに対するindexを使用するが、
SELECT * FROM t_XX where sc_id like 123456;

# id, select_type, table, type, possible_keys, key, key_len, ref, rows, Extra '1', 'SIMPLE', 't_XX', 'range', 'Unique,idx_sc_id', 'Unique', '62', NULL, '529', 'Using where'

このクエリならば、sc_idに対するindexを使用しない(ALLとなる)。
SELECT * FROM t_XX where sc_id = 123456;

# id, select_type, table, type, possible_keys, key, key_len, ref, rows, Extra '1', 'SIMPLE', 't_XX', 'ALL', 'Unique,idx_sc_id', NULL, NULL, NULL, '9647304', 'Using where'

このような現象が発生しておりますが、
なぜ、発生しているかがわかりません。
ご教示いただけないでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/08/26 04:01

実行可能なSQLとテーブル定義をご提示ください。
siosenbei

2019/08/26 04:19

ご連絡、ありがとうございます。 テーブル定義全てはお教えできませんが、 該当カラムの型はvarcharです。
guest

回答2

0

ベストアンサー

あくまで推測ですが、sc_idが文字型なら、

SQL

1SELECT * FROM t_XX where sc_id like 123456;

上記では、123456が暗黙の型変換で文字型に変換され、インデックスは使用される。

SQL

1SELECT * FROM t_XX where sc_id = 123456

上記では、sc_idが暗黙に数値型に変換されてインデックスが使用されない。

というようなことでは無いかと思います。

以下の様にすると改善されないでしょうか。

SQL

1SELECT * FROM t_XX where sc_id = '123456'

投稿2019/08/26 04:11

sazi

総合スコア25195

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

siosenbei

2019/08/26 04:18 編集

ご回答、ありがとうございます! おっしゃる通り、該当カラムはvarcharでした。 解決いたしました。
guest

0

likeと=では効率が違いますからね
また数値と文字列でも効率が変わってきます

SQL

1create table tbl(id int primary key,vNum int,vStr varchar(10),index(vNum),index(vStr)); 2insert into tbl values 3(1,123,'123'),(2,1234,'1234'),(3,125,'125'),(4,345,'345'); 4 5explain select * from tbl where vStr like 123; 6explain select * from tbl where vStr like '123'; 7explain select * from tbl where vStr=123; 8explain select * from tbl where vStr='123'; 9explain select * from tbl where vStr like '123%'; 10explain select * from tbl where vNum like 123; 11explain select * from tbl where vNum like '123'; 12explain select * from tbl where vNum=123; 13explain select * from tbl where vNum='123'; 14

文字列のカラムに数値でマッチングをするとインデックスが利用されないかもしれません

投稿2019/08/26 04:23

yambejp

総合スコア114843

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問