最近確認された5件のデータを照会するビジネスがあります。 `id`、`title` を選択 `th_content` から ここで、`audit_time` < 1541984478 かつ `ステータス` = 'オンライン' `audit_time` DESC、`id` DESC で並べ替え 制限5; 当時の監視状況を確認すると、CPU 使用率が 100% を超えていました。Show テーブルの構造を表示する テーブル `th_content` を作成します ( `id` bigint(20) 符号なし NOT NULL AUTO_INCREMENT, `title` varchar(500) 文字セット utf8 NOT NULL デフォルト '' COMMENT 'コンテンツのタイトル', `content` mediumtext CHARACTER SET utf8 NOT NULL COMMENT 'メインコンテンツ', `audit_time` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '監査時間', `last_edit_time` タイムスタンプ NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最終編集時間', `status` enum('CREATED','CHECKING','IGNORED','ONLINE','OFFLINE') 文字セット utf8 NOT NULL デフォルト 'CREATED' コメント '情報ステータス', 主キー (`id`)、 キー `idx_at_let` (`audit_time`,`last_edit_time`) )ENGINE=InnoDB デフォルト文字セット=utf8mb4; インデックスには、左側に 上記の SQL 実行のロジックを分析します。
最後に、データ量が大きいため、5 行のみが取得されますが、先ほど示した極端な例によれば、実際には 100 万行のデータが照会され、最終的にデータベースの 50 万行のメモリ ソートがメモリ内で実行されます。 したがって、非常に非効率的です。 最初のステップのクエリ プロセスを説明するために概略図が描かれています。ピンクの部分は、最終的にテーブルでクエリする必要があるデータ行を表します。 画像では、インデックス保存ルールに従って一部のデータを偽造して入力しました。何か間違っている点がありましたら、メッセージを残して指摘してください。この図を通して、共同インデックスストレージとインデックスクエリの方法を理解していただければ幸いです。 改善案1 範囲検索は、適切なインデックスでは使いにくいです。audit_time と テーブル `th_content` を変更し、インデックス `idx_audit_status` (`audit_time`, `status`) を追加します。 mysql> explain select `id`, `title` from `th_content` where `audit_time` < 1541984478 and `status` = 'ONLINE' order by `audit_time` desc, `id` desc limit 5; +----+--------------+------------+--------+------------------------------------------+------------------+--------+--------+------------+-------------+ | id | select_type | テーブル | タイプ | possible_keys | key | key_len | ref | 行 | 追加 | +----+--------------+------------+--------+------------------------------------------+------------------+--------+--------+------------+-------------+ | 1 | SIMPLE | th_content | range | idx_at_ft_pt_let、idx_audit_status | idx_audit_status | 4 | NULL | 209754 | where の使用 | +----+--------------+------------+--------+------------------------------------------+------------------+--------+--------+------------+-------------+ 詳細: インデックスを追加した後の実行プロセスを分析してみましょう。
上の図では、ピンク色は最初の列のインデックス要件を満たす行を示しています。1 つずつ前方にクエリを実行すると、このリーフ ノードに 3 つのレコードが見つかります。次に、前のリーフ ノードで左方向にクエリを続行する必要があります。レコードに一致する 5 行が見つかるまで、最終的にテーブルに戻ります。 改善点
この指標の欠点
改善案2 テーブル `th_content` を変更し、インデックス `idx_audit_status` を削除します。 テーブル `th_content` を変更し、インデックス `idx_status_audit` (`status`, `audit_time`) を追加します。 こうすることで、仕分けするときもテーブルに戻すときもプレッシャーがかかりません。 要約する 以上がこの記事の全内容です。この記事の内容が皆様の勉強や仕事に何らかの参考学習価値をもたらすことを願います。123WORDPRESS.COM をご愛顧いただき、誠にありがとうございます。これについてもっと知りたい場合は、次のリンクをご覧ください。 以下もご興味があるかもしれません:
|
<<: VMware 15.5 に CentOS7 をインストールするためのグラフィック チュートリアル
プログラム的アプローチの利点1. スタイルの分散を避けるためのグローバルコントロール2. シンプルな...
目次1. グローバル beforeEach 1. グローバル beforeEach 2. 実装2. ...
コードをコピーコードは次のとおりです。 <!DOCTYPE html> <html...
この記事では、参考までに、スネークゲームを実装するためのWeChatアプレットの具体的なコードを紹介...
CSS3変数について変数を宣言するときは、変数名の前に 2 つのハイフン ( -- ) を追加します...
1. mysqlbinlog: [エラー] 不明な変数 'default-character...
この記事では、例を使用して、MySQL ストアド プロシージャでの case ステートメントの使用方...
質問Nginx は $remote_addr を実際の IP アドレスとして受け取りますが、実際には...
Harborのインストールは非常に簡単ですが、Dockerログインで行き詰まってしまいました。このブ...
MySQL は、ユーザーごとに 2 つの異なるバージョンを提供します。 MySQL コミュニティ サ...
Dockerfile は Docker イメージを構築するために使用されるファイルです。コマンドパラ...
1. MySQLをインストールする(1)ダウンロードしたMySQLの圧縮ファイルをMySQLをインス...
テーブルを素早くコピーする方法まず、テーブル db1.t を作成し、1000 行のデータを挿入します...
水平方向では、テーブル ヘッダーの配置を左、中央、右に設定できます。基本的な構文<TH ALI...
序文MySQL と Navicat をインストールした後、接続時に、ERROR 2059 (HY00...