ホームページ  >  記事  >  データベース  >  mysql 最適化の例を共有する

mysql 最適化の例を共有する

零下一度
零下一度オリジナル
2017-07-17 10:03:331518ブラウズ
  1. 今日、特に Web アプリケーションでは、データベース操作がアプリケーション全体のパフォーマンスのボトルネックになっています。データベースのパフォーマンスに関しては、DBA だけが心配する必要があるのではなく、私たちプログラマも注意を払う必要があります。データベースのテーブル構造を設計し、データベースを操作するとき (特にテーブルを検索するときの SQL ステートメント)、データ操作のパフォーマンスに注意を払う必要があります。ここでは、SQL ステートメントの最適化についてはあまり説明せず、最も多くの Web アプリケーションが含まれるデータベースである MySQL だけに焦点を当てます。以下の最適化のヒントがお役に立てば幸いです。

  2. 1. テーブル構造

  3. 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
2. 実行計画

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

4. 転送時間: 0.001 秒
合計時間 : 17.184 sec

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
E

2. 実行計画

ALTER TABLE `test`.`room_break_history_tmp_test`     ->   ADD  INDEX `idx_handle_time` (`handle_type`, `create_time`);
E

3. : 0.179 秒

以上がmysql 最適化の例を共有するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。