[MySql]バイナリを使用して大文字と小文字を区別してインデックスを作成
8304 ワード
サマリ
BINARYキーワードを使用して大文字と小文字を区別し、インデックスを作成する方法
WHERE LOGIN_ID = BINARY 'value'
検索値の選択-緊急1.大文字と小文字の区別
デフォルトでは、MySQLのvarcharデータ型は大文字と小文字を区別しません.
SELECT *
FROM USER
WHERE LOGIN_ID = 'aaaa';
2. BINARY
1)定義
BINARYは、文字列をバイナリとして位置づけ、バイトごとに比較します.
2)ホットスポット
カラムをBINARYに配置すると、既存のインデックスは有効になりません.WHERE BINARY LOGIN_ID = 'aaaa';
良い方法は、値をバイナリに鋳造することです.WHERE LOGIN_ID = BINARY 'aaaa';
最も良い方法は、コラムをVARBINARY
に変更し、インデックスを設定することです.
テストで理解してみましょう.
3.テスト
1)テストケース
長さ4の大文字と小文字の区切り文字列が作成されました.
生成されたコードは次のとおりです.
52^4は約700万回生成する必要がありますが、10万回入れても1時間以上かかり、10万回テストします.const lower = Array.from(Array(26).keys()).map(x => String.fromCharCode('a'.charCodeAt(0) + x)).join("")
const upper = lower.toUpperCase()
const alphabet = lower + upper
const loginIdList = []
const makeLoginId = (val, cnt) => {
if(cnt > 3) {
loginIdList.push(val)
return
}
for(let i=0; i<52; i++) {
makeLoginId(val + alphabet.charAt(i), cnt + 1)
}
}
makeLoginId('', 0)
console.log(loginIdList)
2)コラムをバイナリにする
クエリコスト10644
実行ルールは「index」と表示されますが、実際にはFULL INDEX SCANです.すべてのLowを表示します.EXPLAIN
SELECT ID, LOGIN_ID
FROM USER
WHERE BINARY LOGIN_ID = 'aaaa';
3)値をバイナリに鋳造する
クエリコスト2.83
「aaaa」~「AAAA」を見つけ、そこで値を比較します.EXPLAIN
SELECT ID, LOGIN_ID
FROM USER
WHERE LOGIN_ID = BINARY 'aaaa';
4)コラムをVARBINARYに変更し、インデックスを設定
クエリコスト0.45
5)比較
クエリコストの差は9300:2:0.45です.
これは現在10万個のテストデータで行われているデータです.実際に多くのデータがインデックスされている場合は、インデックスがない場合は10秒スキップされます.
4.整理
実際の状況では、多くの原因があり、原因があります.
大文字と小文字を区別するコラムは間違っているが、これはすでに発生している.
BINARYのせいで止めないでください.
コラムのタイプを変更し、インデックスを作成します.
デザインも変えられるといいですね.
Reference
この問題について([MySql]バイナリを使用して大文字と小文字を区別してインデックスを作成), 我々は、より多くの情報をここで見つけました
https://velog.io/@skyepodium/MySql-binary-대소문자-구분하면서-인덱스-타기
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
SELECT *
FROM USER
WHERE LOGIN_ID = 'aaaa';
1)定義
BINARYは、文字列をバイナリとして位置づけ、バイトごとに比較します.
2)ホットスポット
カラムをBINARYに配置すると、既存のインデックスは有効になりません.
WHERE BINARY LOGIN_ID = 'aaaa';
良い方法は、値をバイナリに鋳造することです.WHERE LOGIN_ID = BINARY 'aaaa';
最も良い方法は、コラムをVARBINARY
に変更し、インデックスを設定することです.テストで理解してみましょう.
3.テスト
1)テストケース
長さ4の大文字と小文字の区切り文字列が作成されました.
生成されたコードは次のとおりです.
52^4は約700万回生成する必要がありますが、10万回入れても1時間以上かかり、10万回テストします.const lower = Array.from(Array(26).keys()).map(x => String.fromCharCode('a'.charCodeAt(0) + x)).join("")
const upper = lower.toUpperCase()
const alphabet = lower + upper
const loginIdList = []
const makeLoginId = (val, cnt) => {
if(cnt > 3) {
loginIdList.push(val)
return
}
for(let i=0; i<52; i++) {
makeLoginId(val + alphabet.charAt(i), cnt + 1)
}
}
makeLoginId('', 0)
console.log(loginIdList)
2)コラムをバイナリにする
クエリコスト10644
実行ルールは「index」と表示されますが、実際にはFULL INDEX SCANです.すべてのLowを表示します.EXPLAIN
SELECT ID, LOGIN_ID
FROM USER
WHERE BINARY LOGIN_ID = 'aaaa';
3)値をバイナリに鋳造する
クエリコスト2.83
「aaaa」~「AAAA」を見つけ、そこで値を比較します.EXPLAIN
SELECT ID, LOGIN_ID
FROM USER
WHERE LOGIN_ID = BINARY 'aaaa';
4)コラムをVARBINARYに変更し、インデックスを設定
クエリコスト0.45
5)比較
クエリコストの差は9300:2:0.45です.
これは現在10万個のテストデータで行われているデータです.実際に多くのデータがインデックスされている場合は、インデックスがない場合は10秒スキップされます.
4.整理
実際の状況では、多くの原因があり、原因があります.
大文字と小文字を区別するコラムは間違っているが、これはすでに発生している.
BINARYのせいで止めないでください.
コラムのタイプを変更し、インデックスを作成します.
デザインも変えられるといいですね.
Reference
この問題について([MySql]バイナリを使用して大文字と小文字を区別してインデックスを作成), 我々は、より多くの情報をここで見つけました
https://velog.io/@skyepodium/MySql-binary-대소문자-구분하면서-인덱스-타기
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
const lower = Array.from(Array(26).keys()).map(x => String.fromCharCode('a'.charCodeAt(0) + x)).join("")
const upper = lower.toUpperCase()
const alphabet = lower + upper
const loginIdList = []
const makeLoginId = (val, cnt) => {
if(cnt > 3) {
loginIdList.push(val)
return
}
for(let i=0; i<52; i++) {
makeLoginId(val + alphabet.charAt(i), cnt + 1)
}
}
makeLoginId('', 0)
console.log(loginIdList)
EXPLAIN
SELECT ID, LOGIN_ID
FROM USER
WHERE BINARY LOGIN_ID = 'aaaa';
EXPLAIN
SELECT ID, LOGIN_ID
FROM USER
WHERE LOGIN_ID = BINARY 'aaaa';
実際の状況では、多くの原因があり、原因があります.
大文字と小文字を区別するコラムは間違っているが、これはすでに発生している.
BINARYのせいで止めないでください.
コラムのタイプを変更し、インデックスを作成します.
デザインも変えられるといいですね.
Reference
この問題について([MySql]バイナリを使用して大文字と小文字を区別してインデックスを作成), 我々は、より多くの情報をここで見つけました https://velog.io/@skyepodium/MySql-binary-대소문자-구분하면서-인덱스-타기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol