問題の概要今日、仕事中に、DBA が突然、SQL に暗黙的な変換があり、インデックスを使用していないことを示す SQL を発見しました。確認したところ、varchar 型のフィールドであることがわかりました。条件を使用して数値を渡しました。機密保持契約に違反する恐れがあるため、ここでは画像を投稿しません。同様の状況を再現して、皆さんに見ていただきたいと思います。 問題の再現まず、効果を上げるために、USER_ID を varchar 型に設定し、一意のインデックスを追加したユーザー テーブル test_user を作成します。 テーブルtest_userを作成します( ID int(11) NOT NULL AUTO_INCREMENT、 USER_ID varchar(11) DEFAULT NULL COMMENT 'ユーザーアカウント', USER_NAME varchar(255) DEFAULT NULL COMMENT 'ユーザー名', AGE int(5) デフォルト NULL コメント '年齢', COMMENT varchar(255) DEFAULT NULL COMMENT 'はじめに', 主キー (ID) ユニークキー UNIQUE_USER_ID (USER_ID) BTREE 使用 )ENGINE=InnoDB デフォルト文字セット=utf8; テーブルデータは以下のとおりです(データは前回のMySQL記事と同じデータを使用しています。MySQLはUNIONを使用して2つのクエリを接続し、ソートに失敗しますが、テーブル構造が異なることに注意してください)。
次に次のSQLを実行します EXPLAIN SELECT * FROM test_user WHERE USER_ID = 111; 与えられた説明は次のようになります。
条件を引用符で囲んで次のように説明します。 EXPLAIN SELECT * FROM test_user WHERE USER_ID = '111'; この時点で、varchar 型フィールドは文字列としてクエリされたときにはインデックスを使用しますが、数値型としてクエリされたときにはインデックスを使用しないことがわかりました。 問題の拡大質問は、フィールドが整数でインデックスがある場合、文字列でクエリを実行するときにインデックスは使用されないのでしょうか?練習すれば完璧になります。引き続きテストを続けましょう。 -- USER_IDの型を整数に変更する CREATE TABLE test_user ( ID int(11) NOT NULL AUTO_INCREMENT、 USER_ID int(11) DEFAULT NULL COMMENT 'ユーザーアカウント', USER_NAME varchar(255) DEFAULT NULL COMMENT 'ユーザー名', AGE int(5) デフォルト NULL コメント '年齢', COMMENT varchar(255) DEFAULT NULL COMMENT 'はじめに', 主キー(ID)、 ユニークキー UNIQUE_USER_ID (USER_ID) BTREE 使用 ) ENGINE=InnoDB AUTO_INCREMENT=6 デフォルト CHARSET=utf8; EXPLAIN SELECT * FROM test_user WHERE USER_ID = 111; EXPLAIN SELECT * FROM test_user WHERE USER_ID = '111'; 上記の 2 つのステートメントを実行した後、int 型フィールドは、文字列としてクエリされるか数値としてクエリされるかに関係なく、インデックスが作成されることがわかりました。 結論は
まとめると、文字列型がインデックス化されない状況を回避するために、今後 SQL を書くときには引用符を追加するのが最善だと思います。より深い原則についてはさらに検討する必要があります。ご意見がありましたら、ぜひ議論してください。 これで、MySql 整数インデックスと文字列インデックスの無効化または暗黙的な変換に関するこの記事は終了です。MySql 整数インデックスと文字列インデックスの無効化の詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: モバイルデバイス Web 開発における HTML ヘッドの書き方
1. ポート 80 が占有されているかどうかを確認します。通常、ポート 80 は Apache サー...
1. まず、コンピュータのデスクトップにある VMware アイコンをダブルクリックしてソフトウェア...
Element-UI に慣れた開発者なら、無限スクロールの InfiniteScroll が使いにく...
JSON データを美しいインデント形式で表示するには、最も単純な JSON.stringify 関...
1 つのサーバー上で 3 つの MySQL インスタンス プロセスが開始され、それぞれ異なるポート ...
序文SQL の言語分類には主に以下の種類があります。 DDLデータ定義言語作成、削除、変更データ定義...
目次1. forループ2. 二重の for ループ3. whileループ4. dowhileループ5...
MySQL データベース管理ソフトウェアには、エンタープライズ エディションとコミュニティ エディシ...
ゲーム史上最高スコアトップ100をチェックSQLコード cdb_playsgame ps から ps...
はじめに:ナビゲーション バーなどのコンポーネント ベースのアイデアを使用して機能モジュールを完全に...
この記事では、すべてのチェックボックスを選択または解除するためのJavaScriptの具体的なコード...
目次1. Javascript とは何ですか? 2. DOMとは何か3. JSコードの実行方法4. ...
多くの人は、Scss を使用する瞬間からコンパイル方法を説明されてきました。したがって、コマンドのコ...
ウェブデザイナーになるのは簡単ではありません。デザインやアーキテクチャを考慮するだけでなく、さまざま...
ウェブデザイナーを長い間悩ませてきた疑問があります。それは、固定レイアウト、流動的レイアウト、柔軟レ...