mysql> explain select sum(1+2);
mysql の遅いクエリの最適化に関するアイデアの概要と共有
この記事では、mysql に関する関連知識を提供します。主に、スロー クエリ ログを使用してスロー クエリ SQL を特定することや、Explain によるスロー クエリの分析など、スロー クエリの最適化に関連する問題を紹介します。SQL のクエリと SQL の変更SQL に可能な限りインデックスを作成できるようにするために、一緒に見てみましょう。
推奨学習: mysql ビデオ チュートリアル
1 遅いクエリの最適化に関するアイデア
遅いクエリが発生した場合、最適化のアイデアは次のとおりです。
- #スロー クエリ ログを使用してスロー クエリ SQL を特定する
- Explain を使用してスロー クエリ SQL
## を分析する
#SQL を変更し、SQL にインデックスを付けてみる - 2 スロー クエリ ログ
MySQL には、クエリを記録する関数スロー クエリ ログが用意されています。時間が指定された時間しきい値を超えた SQL はログに記録されるため、遅いクエリを特定し、対応する SQL ステートメントを最適化できます。
まず、MySQL の遅いクエリに関連するグローバル変数を確認します:
mysql> show global variables like '%quer%'; +----------------------------------------+-------------------------------+ | Variable_name | Value | +----------------------------------------+-------------------------------+ | binlog_rows_query_log_events | OFF | | ft_query_expansion_limit | 20 | | have_query_cache | YES | | log_queries_not_using_indexes | OFF | | log_throttle_queries_not_using_indexes | 0 | ========================================================================== | long_query_time | 10.000000 |【1】慢查询的时间阈值 ========================================================================== | query_alloc_block_size | 8192 | | query_cache_limit | 1048576 | | query_cache_min_res_unit | 4096 | | query_cache_size | 16777216 | | query_cache_type | OFF | | query_cache_wlock_invalidate | OFF | | query_prealloc_size | 8192 | ========================================================================== | slow_query_log | OFF |【2】慢查询日志是否开启 | slow_query_log_file | /var/lib/mysql/Linux-slow.log |【3】慢查询日志文件存储位置 ========================================================================== +----------------------------------------+-------------------------------+ 15 rows in set (0.00 sec)
ここでは主に 3 つの変数に焦点を当てます:
- long_query_time、時間スロー クエリのしきい値 (秒単位)。SQL ステートメントの実行時間がこの値を超えると、MySQL はそれをスロー クエリと判断します。
- slow_query_log、スロー クエリ ログ機能が有効かどうかオンにすると、スロー クエリの記録
- slow_query_log_file、スロー クエリ ログ ファイルの保存場所
- #スロークエリログ機能はデフォルトでオフになっているため、有効にする必要があります機能
# 开启慢查询日志 mysql> set global slow_query_log=ON; Query OK, 0 rows affected (0.00 sec) # 设置慢查询时间阈值 mysql> set long_query_time=1; Query OK, 0 rows affected (0.00 sec)
mysql> explain select sum(1+2);
ログイン後にコピー
実行結果は次のとおりです。多くのステートメントがあることがわかります。フィールド mysql> explain select sum(1+2);
主にいくつかの重要なフィールドについて説明します。
- table はクエリ テーブルを表しますが、必ずしも存在するとは限りません。このクエリで取得された一時テーブルである可能性があります。
- type は取得タイプを表します。テーブル全体のスキャン、インデックス スキャンなどを使用します。
- #possible_keys は、使用できるインデックス列を示します
- keys は、クエリで実際に使用されるインデックス列を示します。これらはクエリによって最適化されます。プロセッサが決定します。
- #3.1 select_type フィールド
3.2 タイプ フィールド
InnoDB ストレージ エンジンの場合、タイプ カラムは通常、all またはインデックスです。 type フィールドの値は、上から下に向かって、対応する SQL の実行パフォーマンスが徐々に悪くなります。
#3.3 追加フィールド
4 遅いクエリ例
create table user_info_large (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键',
`account` VARCHAR(20) NOT NULL COMMENT '用户账号',
`name` VARCHAR(20) NOT NULL COMMENT '用户名',
`password` VARCHAR(20) not null COMMENT '用户密码',
`area` VARCHAR(20) NOT NULL COMMENT '用户地址',
`signature` VARCHAR(50) not null COMMENT '个性签名',
PRIMARY KEY (`id`) COMMENT '主键',
UNIQUE (`account`) COMMENT '唯一索引',
KEY `index_area_signture` (`area`, `signature`) COMMENT '组合索引'
);
ログイン後にコピー200 万個のデータをランダムに生成mysql> select count(id) from user_info_large;
+-----------+
| count(id) |
+-----------+
| 2000000 |
+-----------+
1 row in set (0.38 sec)
ログイン後にコピー
データの一部をインターセプト:create table user_info_large ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键', `account` VARCHAR(20) NOT NULL COMMENT '用户账号', `name` VARCHAR(20) NOT NULL COMMENT '用户名', `password` VARCHAR(20) not null COMMENT '用户密码', `area` VARCHAR(20) NOT NULL COMMENT '用户地址', `signature` VARCHAR(50) not null COMMENT '个性签名', PRIMARY KEY (`id`) COMMENT '主键', UNIQUE (`account`) COMMENT '唯一索引', KEY `index_area_signture` (`area`, `signature`) COMMENT '组合索引' );
mysql> select count(id) from user_info_large; +-----------+ | count(id) | +-----------+ | 2000000 | +-----------+ 1 row in set (0.38 sec)
インデックス フィールドを使用せずに次の SQL ステートメントを実行します:
SELECT name from user_info_large ORDER BY name desc limit 0,100000;
Navicat ツールによって表示されるクエリ時間は次のとおりです。これは MySQL が実際に SQL を実行する時間ではありません。ネットワーク送信やその他の時間が含まれます。 :
SQL 固有のクエリ時間は、スロー クエリ ログで確認できます:
# Time: 2022-09-26T13:44:18.405459Z # User@Host: root[root] @ [ip] Id: 1893 # Query_time: 10.162999 Lock_time: 0.000113 Rows_sent: 100000 Rows_examined: 2100000 SET timestamp=1664199858; SELECT name from user_info_large ORDER BY name desc limit 0,100000;
説明の一部情報:
Time: SQL 実行の開始時刻
- Query_time: SQL ステートメントのクエリにかかった時間。 10 秒
- Lock_time: ロック テーブルを待機する時間
- #Rows_sent: ステートメントによって返されるレコードの数
- Rows_examined: ストレージ エンジンから返されたレコードの数
- 実行中のスロー クエリはスロー クエリ ログに記録されません。完了後にログに記録されます。 show processlist を使用すると、SQL を実行しているスレッドを表示できます。
SELECT account from user_info_large ORDER BY account desc limit 0,100000;
explain SELECT name from user_info_large ORDER BY name desc limit 0,100000;
可以看到没有使用到索引,type 为 ALL 表示全表扫描,效率最差,并且 Extra 也是外部排序。
再看看这条 SQL 语句:
explain SELECT account from user_info_large ORDER BY account desc limit 0,100000;
分析情况如下:
type 为 index,使用了索引,使用的索引字段为 account,Extra 显示为使用索引排序。
因此,在实际开发中,我们可以针对慢查询的 SQL,使用 explain 分析语句,根据分析情况以及索引的设计,重新设计 SQL 语句,让 SQL 语句尽量走索引,走合适的索引。
5 优化器与索引
在执行 SQL 时,MySQL 的优化器会根据情况选择索引,但并不能保证其执行时间一定最短,我们可以根据实际情况使用 force key (index) 让 SQL 语句强制走某个索引。
例如,以下语句执行后,key 字段为 account,并没有走主键索引。
explain SELECT count(id) from user_info_large;
如果使用 force key,就可以强制令语句走主键索引。
explain SELECT count(id) from user_info_large force key (PRIMARY);
6 总结
在项目中如果发现部分 SQL 语句执行缓慢,等待查询时间长,可以考虑优化慢查询,具体思路为:
通过慢查询日志定位 SQL
使用 explain 分析 SQL
修改 SQL,令其走合适的索引
在使用 explain 时,我们主要关注这些字段:
type
key
Extra
在编写 SQL 使用索引的时候,我们尽量注意一下规则:
模糊查询不要使用通配符 % 开头,例如 like '%abc'
使用 or 关键字时,两边的字段都要有索引。或者使用 union 替代 or
使用复合索引遵循最左原则
索引字段不要参加表达式运算、函数运算
推荐学习:mysql视频教程
以上がmysql の遅いクエリの最適化に関するアイデアの概要と共有の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









MySQLは、インストールが簡単で、強力で管理しやすいため、初心者に適しています。 1.さまざまなオペレーティングシステムに適した、単純なインストールと構成。 2。データベースとテーブルの作成、挿入、クエリ、更新、削除などの基本操作をサポートします。 3.参加オペレーションやサブクエリなどの高度な機能を提供します。 4.インデックス、クエリの最適化、テーブルパーティション化により、パフォーマンスを改善できます。 5。データのセキュリティと一貫性を確保するために、バックアップ、リカバリ、セキュリティ対策をサポートします。

MySQLは、オープンソースのリレーショナルデータベース管理システムです。 1)データベースとテーブルの作成:createdatabaseおよびcreateTableコマンドを使用します。 2)基本操作:挿入、更新、削除、選択。 3)高度な操作:参加、サブクエリ、トランザクション処理。 4)デバッグスキル:構文、データ型、およびアクセス許可を確認します。 5)最適化の提案:インデックスを使用し、選択*を避け、トランザクションを使用します。

次の手順でphpmyadminを開くことができます。1。ウェブサイトコントロールパネルにログインします。 2。phpmyadminアイコンを見つけてクリックします。 3。MySQL資格情報を入力します。 4.「ログイン」をクリックします。

NAVICATプレミアムを使用してデータベースを作成します。データベースサーバーに接続し、接続パラメーターを入力します。サーバーを右クリックして、[データベースの作成]を選択します。新しいデータベースの名前と指定された文字セットと照合を入力します。新しいデータベースに接続し、オブジェクトブラウザにテーブルを作成します。テーブルを右クリックして、データを挿入してデータを挿入します。

MySQLとSQLは、開発者にとって不可欠なスキルです。 1.MYSQLはオープンソースのリレーショナルデータベース管理システムであり、SQLはデータベースの管理と操作に使用される標準言語です。 2.MYSQLは、効率的なデータストレージと検索機能を介して複数のストレージエンジンをサポートし、SQLは簡単なステートメントを通じて複雑なデータ操作を完了します。 3.使用の例には、条件によるフィルタリングやソートなどの基本的なクエリと高度なクエリが含まれます。 4.一般的なエラーには、SQLステートメントをチェックして説明コマンドを使用することで最適化できる構文エラーとパフォーマンスの問題が含まれます。 5.パフォーマンス最適化手法には、インデックスの使用、フルテーブルスキャンの回避、参加操作の最適化、コードの読み取り可能性の向上が含まれます。

手順に従って、NAVICATで新しいMySQL接続を作成できます。アプリケーションを開き、新しい接続(CTRL N)を選択します。接続タイプとして「mysql」を選択します。ホスト名/IPアドレス、ポート、ユーザー名、およびパスワードを入力します。 (オプション)Advanced Optionsを構成します。接続を保存して、接続名を入力します。

データベースから直接削除された行を直接回復することは、バックアップまたはトランザクションロールバックメカニズムがない限り、通常不可能です。キーポイント:トランザクションロールバック:トランザクションがデータの回復にコミットする前にロールバックを実行します。バックアップ:データベースの定期的なバックアップを使用して、データをすばやく復元できます。データベーススナップショット:データベースの読み取り専用コピーを作成し、データが誤って削除された後にデータを復元できます。削除ステートメントを使用して注意してください:誤って削除されないように条件を慎重に確認してください。 WHERE句を使用します:削除するデータを明示的に指定します。テスト環境を使用:削除操作を実行する前にテストします。

NAVICATでSQLを実行する手順:データベースに接続します。 SQLエディターウィンドウを作成します。 SQLクエリまたはスクリプトを書きます。 [実行]ボタンをクリックして、クエリまたはスクリプトを実行します。結果を表示します(クエリが実行された場合)。
