質問仕事中、1 つの SQL クエリ ステートメントのみを実行するインターフェイスがあり、SQL は明らかに主キー列を使用しているものの、速度が非常に遅いことがわかりました。 再生データ テーブル DDL は次のようになります。user_id を主キー インデックスとして使用します。 テーブル `user_message` を作成します ( `user_id` varchar(50) NOT NULL COMMENT 'ユーザーID', `msg_id` int(11) NOT NULL COMMENT 'メッセージID', 主キー (`user_id`) )ENGINE=InnoDB デフォルト文字セット=utf8mb4; 次のクエリ ステートメントを実行すると、キーでは主キー インデックスが使用されていることが示されていますが、行ではテーブル全体がスキャンされ、主キー インデックスが機能していないことが示されています。 EXPLAIN SELECT COUNT(*) FROM user_message WHERE user_id = 1; id|select_type|テーブル|パーティション|タイプ|可能なキー|キー|キー長|ref|行|フィルター済み|追加| --+------------+------------+-----------+----------+---------+---+---------+-------------------------+ 1|SIMPLE |user_message| |index|PRIMARY |PRIMARY|206 | |10000| 10.0|where の使用; index の使用| 調査の結果、データ テーブルの user_id フィールドは VARCHAR 型であり、SQL ステートメントの user_id は INT 型であることがわかりました。 MySQL はステートメントを実行するときに型を変換します。これにより、型変換後に主キー インデックスが無効になります。 暗黙的な変換MySQL の公式ドキュメント (https://dev.mysql.com/doc/refman/8.0/en/type-conversion.html) では、MySQL の型の暗黙的な変換のルールが紹介されています。 演算子の両側のオペランドの型が一致しない場合、MySQL はオペランドの互換性を保つために型変換を実行します。これらの変換は暗黙的に行われます。比較演算の暗黙的な変換について次に説明します。
上記の最後のルールに従って、前の SQL ステートメントでは、文字列と整数の比較が 2 つの浮動小数点の比較に変換されます。左側は文字列型 "1" が浮動小数点数 1.0 に変換されたもので、右側は INT 型 1 が浮動小数点数 1.0 に変換されたものになります。 論理的に考えると、両辺とも浮動小数点数なのでインデックスが使えるはずですが、実行時に使用されないのはなぜでしょうか? その理由は、MySQL で文字列を浮動小数点型に変換するための変換規則が次のとおりであるためです。 1. 数字で始まらないすべての文字列は 0 に変換されます。 CAST('abc' を UNSIGNED として選択) CAST('abc' を UNSIGNED として) | -----------------------+ 0| 2. 数字で始まる文字列を変換する場合、最初の文字から最初の非デジタルコンテンツまでがインターセプトされます。 SELECT CAST('0123abc' AS UNSIGNED) を選択 CAST('0123abc' を UNSIGNED として) | ----------------------------+ 123| したがって、MySQL では、「1」、「1」、「1a」、「01」などの文字列はすべて 1 として数値に変換されます。 MySQL は上記の SQL 文を実行すると、各行の主キー列の値を浮動小数点数に変換し (主キーに対して CAST 関数を実行)、条件パラメータと比較します。インデックス列で関数を使用すると、インデックスが無効になり、最終的にはテーブル全体のスキャンが実行されます。 前の SQL で渡されたパラメータを文字列に変更するだけで、主キー インデックスを使用できるようになります。 EXPLAIN SELECT COUNT(*) FROM user_message WHERE user_id = '1'; id|select_type|テーブル|パーティション|タイプ|可能なキー|キー|キー長|参照|行|フィルター済み|追加| --+-----------+-------------+------------+-----------+---------+---------+----------+-----------+-----------+ 1|SIMPLE |user_message| |ref |PRIMARY |PRIMARY|202 |const| 135| 100.0|インデックスを使用| 要約する1. 条件列が文字列の場合、渡された条件パラメータが整数であれば、まず浮動小数点数に変換され、次にテーブル全体がスキャンされ、インデックスが失敗します。 参照する1. MySQLの暗黙的な変換の簡単な分析 これで、MySQL の暗黙的な型変換によって発生するインデックス無効化の問題を解決する方法についての記事は終了です。MySQL の暗黙的な型変換によって発生するインデックス無効化の詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: Keepalived を使用して Nginx の自動再起動とデュアルアクティブ ホットスタンバイの高可用性を実現する方法について
まず質問させてください。HTML ページを作成するときに、外部から JS ファイルをインポートする場...
CSS 画面サイズの適応を実現するには、まず CSS3 @media メディア クエリを導入する必要...
今日、redis をインストールしたところ、今までになかったいくつかのエラーが発生しました。ここで記...
目次1. プロジェクト環境2. プロジェクトの説明3. プロジェクトの手順1. インストール2. 構...
これは純粋に CSS で実装された大きなドロップダウン メニューです。この大きなメニューは、js コ...
目次序文RMの後には希望はあるのでしょうか?最前線を使ってファイルを取得するextundeleteを...
困り果てて、ふと、私がよく行くSinaのタッチスクリーン版はどうやって作られているのだろう?と考えま...
CSSスタイルとHTMLタグ要素を使用するさまざまな HTML タグに点線の境界線を追加するために、...
まず、データベース テーブルを作成します。 テーブル `t_demo` を作成します ( `id` ...
目次要件の説明:要件分析:ニーズの解決問題解決私はフロントエンドの新人ですが、バックエンドのバグの中...
目次序文ストアドプロシージャ: 1. ストアドプロシージャの作成と呼び出し1. ストアドプロシージャ...
まずはエフェクト画像を投稿します:全体的なスタイルとレイアウトが崩れないように、スクロール バーがロ...
序文ORDER BY 字段名升序/降序、このソートステートメントは皆さんご存知だと思いますが、特殊な...
HTML 検証はHTML 検証を指します。これは、HTML ドキュメントを分析し、標準の HTML ...
Composition API はロジック再利用手順を実装します。ロジックコードを関数に抽出します。...