Google キャンパス採用面接の質問データベース: MySQL 最適化原則

著者: 禅とコンピュータープログラミングの芸術

1 はじめに

1. MySQL を最適化する必要があるのはなぜですか?

MySQL は現在最も人気のあるオープン ソース リレーショナル データベース管理システムであり、メモリ使用量が小さく、優れたパフォーマンスと高いセキュリティを備えているため、基本的なデータ ストレージ ソリューションとして MySQL を使用する企業が増えています。しかし、インターネット エンタープライズ アプリケーションの継続的な成長に伴い、元のデータベース構造とビジネス モデルにより、MySQL の運用効率が徐々に低下し、システムのボトルネックにさえなりました。したがって、MySQL の最適化は、データベース システム全体の運用効率と信頼性を向上させるための重要なステップです。

2. データベースの最適化とは何ですか?

データベースの最適化とは、より良い運用状態を達成するために、リレーショナル データベース管理システム (RDBMS) の運用プロセスとリソース割り当てを調整および改善することを指します。一般に、最適化には次の 3 つの側面が含まれます。

  1. データベース設計の最適化: 合理的なデータベース テーブル構造、インデックス列の順序などを設計することで、クエリ中にスキャンする必要があるデータの量を効果的に削減し、データベース処理の速度を向上させることができます。
  2. SQL ステートメントの最適化: 効果的な SQL クエリ ステートメントを使用すると、不必要なオーバーヘッドが回避され、データベース クエリの効率が向上します。
  3. オペレーティング システムの最適化: Linux システムの場合、ファイル システムを調整し、システム パラメータを設定することで、効率的で安定したシステム動作を実現できます。

2. 概念と用語

1.CPUキャッシュ

CPU キャッシュは、データ アクセス操作を高速化するために Intel マイクロプロセッサ (Intel マイクロプロセッサ) または AMD コプロセッサ (AMD コプロセッサ) に統合されたキャッシュ メモリです。命令キャッシュ、データキャッシュ、その他のキャッシュに分かれており、各キャッシュは独自のサイズ、アクセス速度、機能、場所を持っています。命令またはデータのアドレスが CPU キャッシュにロードされると、メイン メモリから再度読み取ることなく、すぐに取得できます。このキャッシュ機能により、CPU が命令を実行したりデータにアクセスしたりする際の遅延時間が大幅に短縮されます。

2. ディスク I/O 操作

ディスク I/O 操作は、ディスクからメモリへのデータの読み取り、またはディスクへのデータの書き込みを指します。ディスク I/O 操作を通じて、データベース アプリケーションはデータベース内のデータに迅速にアクセスし、データベースの運用効率を向上させることができます。通常の状況では、完全なディスク I/O 操作には通常、数百ミリ秒から数秒かかります。

3.InnoDBエンジン

InnoDB は、MySQL でサポートされるデフォルトのトランザクション ストレージ エンジンの 1 つです。その主な機能は、コミット、ロールバック、およびクラッシュ回復機能を備えたトランザクションセーフなストレージ エンジンを提供することです。また、データベースの一貫性を確保するための行レベルのロック機能も提供します。InnoDB は行レベルのロック データベース エンジンです。つまり、テーブル全体ではなく、関係するレコードのみがロックされます。

3. コアアルゴリズム原理、具体的な操作手順、数式の説明

1. 期限切れのログをクリアする

InnoDB はバックグラウンド スレッドを使用してログの有効期限クリア タスクを実行します。N 秒ごとに、InnoDB はトランザクション ログをチェックして、有効期限が切れたログ エントリがあるかどうかを確認します。一部のログが古いことが判明した場合、それらは削除されます。

# 查看innodb_log_file_size的值,单位为字节
SHOW VARIABLES LIKE 'innodb_log_file_size';

# 查看过期日志阈值,单位为秒
SHOW VARIABLES LIKE 'innodb_old_blocks_time';

# 查询超时或失败事务等待的超时时间,单位为秒
SHOW VARIABLES LIKE 'innodb_lock_wait_timeout';

2. クエリの最適化

クエリを最適化するときは、次の点に注意する必要があります。

  • 適切なインデックスを使用する: 実際のクエリ条件に最も適したインデックスを選択します。
  • フルテーブルスキャンは行わないでください。範囲スキャンとあいまい検索を減らし、インデックスカバレッジクエリを選択してください。
  • ソートはできるだけ避けてください。ソートすると CPU の負荷が増加します。ソートの代わりにキャッシュ メカニズムを使用することもできます。
  • ページング クエリ: ページング クエリにより、結果セットの数が減り、送信量が削減されます。
  • クロスリージョンクエリを減らす: IO の数を減らすために、同じフィールドに結合インデックスを確立することを検討できます。
  • データ サンプリング統計: 統計情報に基づいてデータ分布を分析し、テーブル全体のスキャンを回避します。

3.ロック機構

InnoDB は、行ロックとテーブル ロックの 2 種類のロックをサポートします。行ロックは単一行に対して動作し、複数の行に対して排他的です。テーブル ロックはテーブル全体に対して動作し、複数のユーザー間で共有されます。行ロックのオーバーヘッドは小さいですが、ロック時間が長く、テーブル ロックの競合が深刻で、デッドロックの可能性は低いですが、オーバーヘッドが高くなります。

-- 获取最新插入的id值
SELECT LAST_INSERT_ID(); 

-- 插入数据之前,先使用LOCK TABLE给表加X锁,其他进程不能对该表进行操作
LOCK TABLES table_name WRITE;
INSERT INTO table_name (column1, column2) VALUES ('value1', 'value2');
UNLOCK TABLES;

4. 具体的なコード例と説明

-- MySQL查询优化原则(时间复杂度)

-- 1.避免全表扫描
-- 创建联合索引,以便于避免跨区查询
CREATE INDEX idx ON tablename(col1, col2);

-- 2.选择索引覆盖查询
-- 只需要查询的字段,都可以在联合索引中找到,则可以直接使用联合索引,减少查询计算量,提高效率
EXPLAIN SELECT id, name FROM user WHERE age > 20 AND city ='shanghai' ORDER BY score DESC LIMIT 100 OFFSET 0; 
+----+-------------+------------+------+---------------+---------+---------+-------+------+-----------------------------+
| id | select_type | table      | type | possible_keys | key     | key_len | ref   | rows | Extra                       |
+----+-------------+------------+------+---------------+---------+---------+-------+------+-----------------------------+
|  1 | SIMPLE      | user       | range| idx           | idx     | 779     | const |   45 | Using where; Using index    |
+----+-------------+------------+------+---------------+---------+---------+-------+------+-----------------------------+

-- 3.分页查询
-- 当只需返回查询结果的一部分,可以使用LIMIT关键字,限制返回记录的数量。同时,还可以利用OFFSET关键字跳过指定数量的记录,实现分页效果
SELECT * FROM user LIMIT 10 OFFSET 0; -- 返回第1~10条记录
SELECT * FROM user LIMIT 10 OFFSET 10; -- 返回第11~20条记录

-- 4.避免排序
-- 在需要排序的情况下,应该尽量避免进行排序,而改用缓存机制来替换排序。例如,可以使用Redis缓存数据,然后按照需求返回数据。
SELECT * FROM user ORDER BY age ASC LIMIT 10; 

5. 今後の開発動向と課題

インターネット エンタープライズ アプリケーションの継続的な成長に伴い、元のデータベース構造とビジネス モデルにより、MySQL の運用効率が徐々に低下し、システムのボトルネックにさえなりました。この問題を解決するために、Google はインメモリ データベースの開発、エンジン レベルの最適化、ロック メカニズムの改善など、MySQL の最適化に多くのエネルギーと労力を費やしました。クラウド コンピューティング、コンテナ化された展開、ビッグ データ シナリオの継続的な人気により、MySQL ベースのデータベースの人気はますます高まると私は考えています。

Supongo que te gusta

Origin blog.csdn.net/universsky2015/article/details/133565513
Recomendado
Clasificación