今日、特に Web アプリケーションでは、データベース操作がアプリケーション全体のパフォーマンスのボトルネックになっています。データベースのパフォーマンスに関しては、DBA だけが心配する必要があるのではなく、私たちプログラマも注意を払う必要があります。データベースのテーブル構造を設計し、データベースを操作するとき (特にテーブルを検索するときの SQL ステートメント)、データ操作のパフォーマンスに注意を払う必要があります。ここでは、SQL ステートメントの最適化についてはあまり説明せず、最も多くの Web アプリケーションが含まれるデータベースである MySQL だけに焦点を当てます。以下の最適化のヒントがお役に立てば幸いです。
1. テーブル構造
CREATE TABLE `room_break_history_tmp_test ` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `break_type` INT(11) DEFAULT NULL, `app_id` INT(11) DEFAULT NULL, `room_id` INT(11) DEFAULT NULL, `from_user_id` INT(11) DEFAULT NULL, `to_user_id` INT(11) DEFAULT NULL, `content_type` INT(11) DEFAULT NULL, `content_name` VARCHAR(300) DEFAULT NULL, `source_message` VARCHAR(1536) DEFAULT NULL, `send_message` VARCHAR(1536) DEFAULT NULL, `request_type` INT(4) DEFAULT NULL, `report_relation` VARCHAR(1536) DEFAULT NULL, `handle_type` INT(11) DEFAULT NULL, `handle_uid` INT(11) DEFAULT NULL, `create_time` DATETIME DEFAULT NULL, PRIMARY KEY (`id`), KEY `idx_from_user_id` (`room_id`,`from_user_id`,`handle_type`,`create_time`) ) ENGINE=INNODB AUTO_INCREMENT=3416971 DEFAULT CHARSET=utf8mb4
DESC SELECT COUNT(1) FROM (SELECT COUNT(1) FROM room_break_history_tmp_test WHERE `create_time` BETWEEN '2017-07-01 22:25:33' AND '2017-07-01 22:27:00' AND handle_type = 5 GROUP BY room_id, from_user_id) AS keywordtemp
5. 説明、実行計画によると、type はインデックス、key と key_len は正常ですが、インデックスは削除されているようですが、行はほぼ完全なテーブル レコードです (正確ではありません。完全なテーブル スキャンです)。 300 万を超えるデータの実行時間は実際には 17 秒です。
感想: フィールドの nullable を not null に変更した後、key_len が短くなります。空かどうかの判定ロジックがデータに追加されますか? NULL に関する記事:
改善:
1. インデックスの追加
id select_type table type possible_keys key key_len ref rows Extra ------ ----------- ------------------ ------ ---------------- ---------------- ------- ------ ------- -------------------------- 1 PRIMARY <derived2> ALL (NULL) (NULL) (NULL) (NULL) 3438331 (NULL) 2 DERIVED room_break_history index idx_from_user_id idx_from_user_id 21 (NULL) 3438331 Using where; Using index
2. 実行計画
ALTER TABLE `test`.`room_break_history_tmp_test` -> ADD INDEX `idx_handle_time` (`handle_type`, `create_time`);
以上がmysql 最適化の例を共有するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。