ホームページ  >  記事  >  データベース  >  MySQL の最適化接続最適化のサンプル コード

MySQL の最適化接続最適化のサンプル コード

黄舟
黄舟オリジナル
2017-03-16 14:24:151392ブラウズ

MySQL接続の最適化とは、主にクライアントがデータベースに接続するプロセスと、クライアントのリクエストに応じてデータベースがデータテーブルとインデックスを開くプロセスに含まれるパラメータ調整を指します。以下で詳しく説明します

MySQL の最適化

キャッシュ前述の最適化この記事では、非常に重要な概念について説明しました。つまり、表示変数は、my.cnf 値でコンパイルまたは設定されたシステムの変数を表すために使用されます。 Show status は status 値と呼ばれ、現在実行中のサービス インスタンスのステータス情報を表示し、動的に変化する値です。したがって、現在の MySQL が正常に実行されているかどうかを観察するためによく使用されます。正常でない場合は、static パラメーターを調整して MySQL のパフォーマンスを向上させます。したがって、これら 2 つの概念の違いを理解することが、その後のチューニングの基礎となります。

MySQL 接続の最適化

以前、社内で MySQL に接続しようとしたとき、常に接続できなかったことを思い出します。 DBA を見つけて原因を調査したところ、現在の MySQL 接続数がいっぱいであることが判明し、調整した結果、問題は解決されました。接続数が多すぎるエラーには、一般に 2 つの理由があります。1 つ目は、MySQL に接続する人が実際に多く、接続数が不足することです。 2 つ目は、max_connections 値が小さすぎることです。

1. 接続パラメータ (変数を表示)


mysql> show variables like '%connect%';
+-----------------------------------------------+-----------------+
| Variable_name                 | Value      |
+-----------------------------------------------+-----------------+
| character_set_connection           | utf8      |
| collation_connection             | utf8_general_ci |
| connect_timeout                | 10       |
| disconnect_on_expired_password        | ON       |
| init_connect                 |         |
| max_connect_errors              | 100       |
| max_connections                | 151       |
| max_user_connections             | 0        |
| performance_schema_session_connect_attrs_size | 512       |
+-----------------------------------------------+-----------------+

max_connections は、MySQL サービス インスタンスが同時に受け入れることができる同時接続の最大数を指します。実際、MySQL は最大接続数に 1 を追加するアルゴリズムをサポートしており、接続数を使い果たした場合でも、スーパー管理者は管理のためにサーバーとの接続を確立できます。

max_connections是指MySQL服务实例能够同时接受的的最大并发连接数。MySQL实际上支持最大连接数加一的算法,保障当连接数用完的时候,超级管理员依然可以和服务端建立连接,进行管理。

max_user_connections设置指定账号的最大并发连接数。

max_connect_errors 当某台非法主机恶意连接MySQL服务端,遭到的错误达到设置值后,MySQL会解决来自该主机的所有连接。但执行flush hosts后会清零。

2、连接状态(show status)

有一点需要注意的,变量值(show variables)是以小写字母开头的,而状态值(show status)是以大写字母开头。这样区分有助于记忆和分类


mysql> show status like '%connections%';
+-----------------------------------+-------+
| Variable_name           | Value |
+-----------------------------------+-------+
| Connection_errors_max_connections | 0   |
| Connections            | 197  |
| Max_used_connections       | 2   |
+-----------------------------------+-------+

Connection_errors_max_connections 当MySQL的最大并发数大于系统变量(show variables)中max_connections的最大并发数,因此而被拒绝的次数,将会记录在这个变量里。如果Connection_error_max_connections值比较大,则说明当前系统并发比较高,要考虑调大max_connections的值。

Connections表示MySQL从启动至今,成功建立连接的连接数,这个值是不断累加的。

Max_used_connections表示MySQL从启动至今,同一时刻并发的连接数,取得是最大值。如果这个值大于 max_connections则表明系统经常处于高并发的状态,应该考虑调大最大并发连接数。

3、连接线程参数(thread variabls and status)


mysql> show variables like 'thread%';
+--------------------+---------------------------+
| Variable_name   | Value           |
+--------------------+---------------------------+
| thread_cache_size | 9             |
| thread_concurrency | 10            |
| thread_handling  | one-thread-per-connection |
| thread_stack    | 262144          |
+--------------------+---------------------------+

thread_cache_size 设置连接线程缓存的数目。这个缓存相当于MySQL线程的缓存池(thread cache pool),将空闲的连接线程放入连接池中缓存起来,而非立即销毁。当有新的连接请求时,如果连接池中有空闲的连接,则直接使用。否则要重新创建线程。创建线程是一个不小的系统开销。MySQL的这部分线程处理和Nginx 的线程处理有异曲同工之妙,以后介绍Nginx的线程处理时,会拿来做对比。

thread_handling 默认值是: one-thread-per-connection 表示为每个连接提供或者创建一个线程来处理请求,直至请求完毕,连接销毁或者存入缓存池。当值是no-threads 时,表示在始终只提供一个线程来处理连接,一般是单机做测试使用的。

thread_stack stack 是堆的意思,由PHP 进程详解这篇博客,知道进程和线程都是有唯一的ID的,进程的ID系统会维护,二线程的ID,则由具体的线程库区维护,当进程或者线程休眠的时候,进程的上下文信息要在内存中开辟出一块区域,保存进程的上下文信息,以便于迅速唤醒程序。默认为MySQL的每个线程设置的堆栈大小为:262144/1024=256k

查看线程状态信息


mysql> show status like 'Thread%';
+-------------------+-------+
| Variable_name   | Value |
+-------------------+-------+
| Threads_cached  | 1   |
| Threads_connected | 1   |
| Threads_created  | 2   |
| Threads_running  | 1   |
+-------------------+-------+

Thread_cached 当前线程池的线程数

Thread_connectedmax_user_connections指定したアカウントの最大同時接続数を設定します。

🎜max_connect_errors 不正なホストが MySQL サーバーに悪意を持って接続し、発生したエラーが設定値に達すると、MySQL はホストからのすべての接続を解決します。ただし、flush🎜 ホストを実行するとクリアされます。 🎜🎜🎜2. 接続ステータス (show status)🎜🎜🎜 注意すべき点は、変数値 (show variables) は小文字で始まるのに対し、ステータス値 (show status) は大文字で始まることです。この区別は記憶と分類に役立ちます🎜🎜🎜🎜
mysql> show variables like 'back_log';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| back_log   | 80  |
+---------------+-------+
🎜Connection_errors_max_connections MySQL の最大同時実行数が
システム変数 🎜 (変数を表示) の max_connections の最大同時数、つまり拒否の数がこの変数に記録されます。 Connection_error_max_connections の値が比較的大きい場合は、現在のシステムの同時実行性が比較的高いことを意味するため、max_connections の値を増やすことを検討する必要があります。 🎜🎜Connections は、MySQL が開始されてから正常に確立された接続の数を示します。この値は継続的に蓄積されます。 🎜🎜Max_used_connections は、MySQL の開始以降の同時接続の最大数を示します。この値が max_connections より大きい場合は、システムが頻繁に同時実行性の高い状態にあることを示しているため、同時接続の最大数を増やすことを検討する必要があります。 🎜🎜🎜3. 接続スレッドのパラメータ (スレッド変数とステータス) 🎜🎜🎜🎜🎜
mysql> show status like 'Aborted%';
+------------------+-------+
| Variable_name  | Value |
+------------------+-------+
| Aborted_clients | 0   |
| Aborted_connects | 219  |
+------------------+-------+
🎜thread_cache_size 接続スレッドのキャッシュ数を設定します。このキャッシュは MySQL スレッド キャッシュ プール (スレッド キャッシュ プール) と同等であり、アイドル状態の接続スレッドを接続プールに配置し、それらをすぐに破棄するのではなくキャッシュします。新しい接続要求がある場合、接続プールにアイドル状態の接続がある場合は、それが直接使用されます。それ以外の場合は、スレッドを再作成する必要があります。スレッドの作成は、かなりのシステム オーバーヘッドを引き起こします。 MySQL のスレッド処理のこの部分は、Nginx のスレッド処理と似ています。今後 Nginx のスレッド処理を紹介するときに、それらを比較してみます。 🎜🎜thread_handling デフォルト値は次のとおりです: 接続ごとに 1 つのスレッドは、リクエストが完了するか、接続が破棄されるかキャッシュに保存されるまで、リクエストを処理するために各接続にスレッドを提供または作成することを意味します。プール。値が no-thread の場合、接続を処理するために常に 1 つのスレッドのみが提供されることを意味します。これは通常、単一マシンでのテストに使用されます。 🎜🎜thread_stack stack はヒープを意味します。このブログでは、プロセスとスレッドが固有の ID を持つことが知られており、2 番目のスレッドの ID が決定されます。特定のスレッド ライブラリ領域のメンテナンスにより、プロセスまたはスレッドがスリープしているときに、プログラムをすぐに起動できるように、プロセスのコンテキスト情報を保存するメモリ領域をメモリ内に開く必要があります。 MySQL の各スレッドに設定されているデフォルトのスタック サイズは次のとおりです: 262144/1024=256k🎜🎜スレッドのステータス情報を表示🎜🎜🎜🎜
mysql> show status like 'Slow%';
+---------------------+-------+
| Variable_name    | Value |
+---------------------+-------+
| Slow_launch_threads | 0   |
| Slow_queries    | 0   |
+---------------------+-------+
🎜Thread_cached 現在のスレッド プール内のスレッドの数🎜🎜Thread_connected 現在の接続数🎜

Thread_cached: 当前连接线程创建数, 如果这个值过高,可以调整threadcachesize 也就是调整线程缓存池的大小。

Thred_runnint: 当前活跃的线程数。

连接请求堆栈

MySQL在很短的时间内,突然收到很多的连接请求时,MySQL会将不能来得及处理的连接请求保存在堆栈中,以便MySQL后续处理。back_log参数设置了堆栈的大小,可以通过如下命令查看:


mysql> show variables like 'back_log';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| back_log   | 80  |
+---------------+-------+

连接异常


mysql> show status like 'Aborted%';
+------------------+-------+
| Variable_name  | Value |
+------------------+-------+
| Aborted_clients | 0   |
| Aborted_connects | 219  |
+------------------+-------+

Aborted_clients MySQL 客户机被异常关闭的次数。

Aborted_connects 试图连接到MySQL服务器而失败的连接次数。

other


mysql> show status like 'Slow%';
+---------------------+-------+
| Variable_name    | Value |
+---------------------+-------+
| Slow_launch_threads | 0   |
| Slow_queries    | 0   |
+---------------------+-------+


mysql> show variables like 'slow_launch_time';
+------------------+-------+
| Variable_name  | Value |
+------------------+-------+
| slow_launch_time | 2   |
+------------------+-------+

Slow_lunch_threads 创建线程的时间过长,超过slow_launch_time的设定值,则会记录。

可以通过使用 Connection_error%来查看连接的错误状态信息:


mysql> show status like 'Connection_error%';
+-----------------------------------+-------+
| Variable_name           | Value |
+-----------------------------------+-------+
| Connection_errors_accept     | 0   |
| Connection_errors_internal    | 0   |
| Connection_errors_max_connections | 0   |
| Connection_errors_peer_address  | 0   |
| Connection_errors_select     | 0   |
| Connection_errors_tcpwrap     | 0   |
+-----------------------------------+-------+

Connection_errors_peer_address 查找MySQL客户机IP地址是发生的错误数。

以上がMySQL の最適化接続最適化のサンプル コードの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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