1. 背景 Youzan の各 OLTP データベース インスタンスには、実行時間が特定のしきい値を超える SQL ステートメントを強制終了するための sql-killer プロセスが設定されています。午後、開発者はSQLが強制終了したというエラーメッセージを受け取り、開発者のトラブルシューティングを支援しました。この記事ではこのケースを紹介します。 第2のシナリオ分析 テーブル構造: テーブル `xxx_info` を作成します ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', `user_id` bigint(20) unsigned NOT NULL DEFAULT '0' , `group_id` bigint(20) unsigned NOT NULL DEFAULT '0', `nick_name` varchar(30) NOT NULL DEFAULT '' COMMENT 'ニックネーム', `is_del` tinyint(5) NOT NULL DEFAULT '0' COMMENT '0: データが有効、1: データは論理的に削除されている', `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '作成時刻', `updated_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '変更時刻', 主キー (`id`)、 キー `idx_userid_groupid` (`user_id`,`group_id`) ) ENGINE=InnoDB AUTO_INCREMENT=1382032 デフォルトCHARSET=utf8mb4 ; 問題のSQLは次のとおりです xxx_info から id、name、status を選択します。user_id は (670039223,'373149878') であり、group_id は 1 であり、is_del は 0 です。 最初に SQL を見たとき、テーブル構造とインデックス user_id をチェックしました。これは数値型で、インデックスは正常でした。その後、手動実行プランでは idx_userid_groupid インデックスが使用されませんでした。 2つの異なるタイプのフィールドのuser_idが「暗黙の変換」を引き起こしている疑いがあります。パラメータ値を数値型または文字列に変更するか、user_id=数値型またはuser_id=文字列を使用して再度実行してください。 実行計画は正しいです。 2つの問題を解決する必要があります では、(X,Y,Z) の user_id が異なるタイプである場合、なぜインデックスが通過しないのでしょうか? 実行プランをトレースするには、optimizer_trace を使用します。 セッション optimizer_trace を 'enabled=on' に設定します。 xxx_info から id、nick_name、is_del を選択します。user_id は (670039223,'373149878') であり、group_id は 1 であり、is_del は 0 です。 information_schema.optimizer_trace から * を選択します。 xxx_info から id、nick_name、is_del を選択します。user_id は (670039223,'373149878') であり、group_id は 1 であり、is_del は 0 です。 information_schema.optimizer_trace から * を選択します。 セッション optimizer_trace を 'enabled=off' に設定します。 2つのSQL文の実行計画を取得し、比較します。結果は次のようになります。 その結果を見て私は言った https://bugs.mysql.com を調べましたが、関連する結果は見つかりませんでした。 コード内で異なるタイプの値を生成するにはどうすればよいでしょうか? 以下は開発者自身のテストです 現在の解決策は、開発者とコミュニケーションを取り、プログラム内でパラメータ型の一貫性チェックを実行し、すべてを int/long 型に変換するように依頼することです。 暗黙的な変換によってインデックスが失敗する一般的なシナリオに関する特別な注意 1 ここで、判定記号の左側は文字列で、右側は値です。 名前 = 123 2 複数テーブル結合条件のフィールドタイプが矛盾している(1と同様) 3 マルチテーブル結合条件の文字セットタイプが異なります。例えば a テーブル order_no は utf8mb4、b テーブル order_no は utf8 興味のある友人は、さらにテストしたり、他のケースについて話し合ったりすることができます。 上記はMySQL最適化事例の詳細です。MySQL最適化事例の詳細については、123WORDPRESS.COMの他の関連記事にも注目してください。 以下もご興味があるかもしれません:
|
<<: FTP、FTPS、SFTPの違いについて簡単に説明します
>>: Vue3 ベースのフルスクリーン ドラッグ アップロード コンポーネント
準備Windows Server 2008 R2 Enterprise (2.40GH、8GB、64...
この記事では、マウス フリップナビゲーションの制作についてまだ疑問を持っている友人の役に立つことを期...
この記事は、4G メモリ システム用の MySQL 構成ファイル ソリューションです (主に Inn...
ユーザーが初めて MySQL データベースをインストールするとき、初期のルート パスワードを変更する...
3D座標の概念要素が回転すると、その座標軸も一緒に回転します。注 -y方向の問題立方体を回転させる効...
Navicat が MySql サーバーにリモート接続できない問題の解決策は、先頭に書かれています:...
Linux で if を使用してディレクトリが存在するかどうかを判断する方法方法は次のとおりです。...
カーソルの作成まず、MySql でデータ テーブルを作成します。 存在しない場合はテーブルを作成 `...
背景ブラウザの互換性の問題を解決するのは非常に面倒なことです。高度な技術はそれほど必要ありませんが、...
質問:最近、プロジェクトを展開すると文字化けしたデータが出てきました。確認したところ、プロジェクトは...
1.0 Redis の永続性Redis はメモリ内データベースです。サーバー プロセスが終了すると、...
目次文字列オブジェクトのメソッド方法 1: indexOf() (推奨)方法 2: search()...
1. ワニスの紹介Varnish は、高性能なオープンソースのリバースプロキシサーバーおよび HTT...
この記事では、弾性ナビゲーション効果を実現するためのJavaScriptの具体的なコードを参考までに...
Git 入門Git は、Linux(R) カーネル開発の管理を支援するために 2005 年に Lin...