最近確認された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 をインストールするためのグラフィック チュートリアル
設定例 アップストリームバックエンド{ サーバー backend1.example.com 重み=5...
最近レスポンシブ デザインについて学んでいて、これについていくつか整理してみました。写真の一部はイン...
SeLinuxを無効にするsetenforce 0永久に閉店: vi /etc/selinux/c...
DataGrid コントロールの DataSource プロパティがデザイン時に設定されている場合、...
JavaScript の DOM イベント モデルでは、オブジェクトの addEventListen...
序文最近、いくつかのフロントエンド プロジェクトに取り組んでおり、ページにいくつかのテーブルを表示す...
1. MySQL のインデックスの使用方法インデックスは、特定の列の値を持つ行をすばやく見つけるため...
場合によっては、フィールドから別の新しいフィールドにデータの列全体をコピーする必要があります。これは...
React Native は、2015 年 4 月に Facebook によってオープンソース化され...
MySQL 外部キー制約 (FOREIGN KEY) はテーブルの特別なフィールドであり、主キー制約...
目次インストールコンポーネントのインポート基本的な使い方保存したマークダウンまたは HTML テキス...
MySQL のページングステートメントの使用制限Oracle や MS SqlServer と比較す...
序文データベース トランザクションに関して言えば、トランザクションの ACID 特性、分離レベル、解...
目次1. 父から息子へ2. 息子から父へ3. ブラザーコンポーネント通信(バス) 4. ref/re...
/etc/my.confファイルで、[mysqld]の下に次の行を追加します: skip-grant...