ホームページ >データベース >mysql チュートリアル >mysqlのバッファリングとキャッシュ設定の詳細な説明
Mysql リレーショナル データベース管理システム
MySQL は、スウェーデンの MySQL AB 社によって開発された、オープンソースの小規模リレーショナル データベース管理システムです。 MySQL は、インターネット上の小規模および中規模の Web サイトで広く使用されています。 MySQL は、サイズが小さく、速度が速く、総所有コストが低く、特にオープンソースの特性により、Web サイトの総所有コストを削減するために、多くの中小規模の Web サイトが Web サイト データベースとして MySQL を選択しています。
この記事では主に、mysql 最適化プロセスの 2 つの重要なパラメーターであるバッファリングとキャッシュの設定について説明します。気に入っていただければ幸いです
MySQL の調整可能な設定は、mysqld プロセス全体に適用することも、単一クライアントセッション。
サーバー側の設定
各テーブルはディスク上のファイルとして表すことができ、最初にファイルを開いてから読み取る必要があります。ファイルからデータを読み取るプロセスを高速化するために、mysqld はこれらの開いているファイルを /etc/mysqld.conf の table_cache で指定された最大数までキャッシュします。リスト 4 は、テーブルを開くことに関連するアクティビティを表示する方法を示しています。
リスト 4. 開いているテーブルのアクティビティを表示する
mysql> SHOW STATUS LIKE 'open%tables'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | Open_tables | 5000 | | Opened_tables | 195 | +---------------+-------+ 2 rows in set (0.00 sec)
リスト 4 は、現在 5,000 のテーブルが開いており、キャッシュ内に使用可能なファイル記述子がないため 195 のテーブルを開く必要があることを示しています (統計が以前にクリアされているため、したがって、5,000 個の開いたテーブルに 195 個のレコードしかないという状況が発生する可能性があります)。 SHOW STATUS コマンドを再実行すると Opened_tables が急激に増加する場合は、キャッシュ ヒット率が不十分であることを示します。 Open_tables が table_cache 設定よりもはるかに小さい場合、値は大きすぎます (ただし、拡大の余地があることは決して悪いことではありません)。たとえば、テーブルのキャッシュを調整するには、table_cache =5000 を使用します。
テーブルキャッシュと同様に、スレッド用のキャッシュもあります。 mysqld は、接続の受信時に必要に応じてスレッドを生成します。接続がすぐに変化する負荷の高いサーバーでは、後で使用するためにスレッドをキャッシュすると、最初の接続が高速化されます。
リスト 5 は、十分なスレッドがキャッシュされているかどうかを判断する方法を示しています。
リスト 5. スレッド使用統計の表示
mysql> SHOW STATUS LIKE 'threads%'; +-------------------+--------+ | Variable_name | Value | +-------------------+--------+ | Threads_cached | 27 | | Threads_connected | 15 | | Threads_created | 838610 | | Threads_running | 3 | +-------------------+--------+ 4 rows in set (0.00 sec)
ここで重要な値は Threads_created で、この値は mysqld が新しいスレッドを作成する必要があるたびに増加します。 SHOW STATUS コマンドを連続して実行するときにこの数が急速に増加する場合は、スレッド キャッシュを増やすことを試みる必要があります。たとえば、my.cnf で thread_cache = 40 を使用すると、これを実現できます。
キーワードバッファは、MyISAMテーブルのインデックスブロックを保存します。理想的には、これらのブロックに対するリクエストはディスクではなくメモリから送信される必要があります。リスト 6 は、ディスクから読み取られたブロック数とメモリから読み取られたブロック数を確認する方法を示しています。
リスト 6. キーワードの効率を決定する
mysql> show status like '%key_read%'; +-------------------+-----------+ | Variable_name | Value | +-------------------+-----------+ | Key_read_requests | 163554268 | | Key_reads | 98247 | +-------------------+-----------+ 2 rows in set (0.00 sec)
Key_reads はディスクにヒットするリクエストの数を表し、Key_read_requests は合計数です。ディスクにヒットした読み取りリクエストの数を読み取りリクエストの総数で割ったものがミス率です。この場合、1,000 リクエストごとにメモリ内で約 0.6 個のミスが発生します。ディスク ヒット数が 1,000 リクエストあたり 1 件を超える場合は、キーワード バッファを増やすことを検討する必要があります。たとえば、key_buffer =384M と指定すると、バッファが 384MB に設定されます。
一時テーブルはより高度なクエリで使用できます。この場合、データはその後の処理 (GROUPBY 句など) の前に一時テーブルに保存される必要があり、メモリ内に一時テーブルを作成するのが理想的です。ただし、一時テーブルが大きくなりすぎる場合は、ディスクに書き込む必要があります。リスト 7 は、一時テーブルの作成に関連する統計を示しています。
リスト 7. 一時テーブルの使用を決定する
mysql> SHOW STATUS LIKE 'created_tmp%'; +-------------------------+-------+ | Variable_name | Value | +-------------------------+-------+ | Created_tmp_disk_tables | 30660 | | Created_tmp_files | 2 | | Created_tmp_tables | 32912 | +-------------------------+-------+ 3 rows in set (0.00 sec)
一時テーブルが使用されるたびに、Created_tmp_tables が増加し、Created_tmp_disk_tables も増加します。この比率は関係するクエリによって異なるため、厳密なルールはありません。 Created_tmp_disk_tables を時間の経過とともに監視すると、作成されたディスク テーブルの割合が表示され、セットアップの効率を判断できます。 tmp_table_size と max_heap_table_size は両方とも一時テーブルの最大サイズを制御するため、両方の値が my.cnf に設定されていることを確認してください。
セッションごとの設定
以下の設定はセッションごとです。これらのオプションに存在する可能性のある接続の数を掛けると、大量のメモリが必要になるため、これらの数値を設定するときは十分に注意してください。コードを使用してセッション内でこれらの数値を変更することも、すべてのセッションの my.cnf でこれらの設定を変更することもできます。
MySQL はソートが必要な場合、ディスクからデータを読み取るときにデータ行を保存するためにソート バッファを割り当てます。並べ替えるデータが大きすぎる場合は、データをディスク上の一時ファイルに保存して、再度並べ替える必要があります。 sort_merge_passes ステータス変数が大きい場合、これはディスク アクティビティを示しています。リスト 8 は、ソート関連のステータス カウンター情報を示しています。
リスト 8. 並べ替え統計を表示する
mysql> SHOW STATUS LIKE "sort%"; +-------------------+---------+ | Variable_name | Value | +-------------------+---------+ | Sort_merge_passes | 1 | | Sort_range | 79192 | | Sort_rows | 2066532 | | Sort_scan | 44006 | +-------------------+---------+ 4 rows in set (0.00 sec)
如果 sort_merge_passes 很大,就表示需要注意sort_buffer_size。例如,sort_buffer_size = 4M 将排序缓冲区设置为 4MB。
MySQL也会分配一些内存来读取表。理想情况下,索引提供了足够多的信息,可以只读入所需要的行,但是有时候查询(设计不佳或数据本性使然)需要读取表中大量数据。要理解这种行为,需要知道运行了多少个 SELECT语句,以及需要读取表中的下一行数据的次数(而不是通过索引直接访问)。实现这种功能的命令如清单 9 所示。
清单 9. 确定表扫描比率
mysql> SHOW STATUS LIKE "com_select"; +---------------+--------+ | Variable_name | Value | +---------------+--------+ | Com_select | 318243 | +---------------+--------+ 1 row in set (0.00 sec) mysql> SHOW STATUS LIKE "handler_read_rnd_next"; +-----------------------+-----------+ | Variable_name | Value | +-----------------------+-----------+ | Handler_read_rnd_next | 165959471 | +-----------------------+-----------+ 1 row in set (0.00 sec)
Handler_read_rnd_next /Com_select 得出了表扫描比率 —— 在本例中是 521:1。如果该值超过4000,就应该查看 read_buffer_size,例如read_buffer_size = 4M。如果这个数字超过了8M,就应该与开发人员讨论一下对这些查询进行调优了!
查看数据库缓存配置情况
mysql> SHOW VARIABLES LIKE ‘%query_cache%'; +——————————+———+ | Variable_name | Value | +——————————+———+ | have_query_cache | YES | –查询缓存是否可用 | query_cache_limit | 1048576 | –可缓存具体查询结果的最大值 | query_cache_min_res_unit | 4096 | | query_cache_size | 599040 | –查询缓存的大小 | query_cache_type | ON | –阻止或是支持查询缓存 | query_cache_wlock_invalidate | OFF | +——————————+———+
配置方法:
在MYSQL的配置文件my.ini或my.cnf中找到如下内容:
# Query cache is used to cache SELECT results and later returnthem # without actual executing the same query once again. Having thequery # cache enabled may result in significant speed improvements, ifyour # have a lot of identical queries and rarely changing tables.See the # "Qcache_lowmem_prunes" status variable to check if the currentvalue # is high enough for your load. # Note: In case your tables change very often or if your queriesare # textually different every time, the query cache may result ina # slowdown instead of a performance improvement. query_cache_size=0
以上信息是默认配置,其注释意思是说,MYSQL的查询缓存用于缓存select查询结果,并在下次接收到同样的查询请求时,不再执行实际查询处理而直接返回结果,有这样的查询缓存能提高查询的速度,使查询性能得到优化,前提条件是你有大量的相同或相似的查询,而很少改变表里的数据,否则没有必要使用此功能。可以通过Qcache_lowmem_prunes变量的值来检查是否当前的值满足你目前系统的负载。注意:如果你查询的表更新比较频繁,而且很少有相同的查询,最好不要使用查询缓存。
具体配置方法:
1. 将query_cache_size设置为具体的大小,具体大小是多少取决于查询的实际情况,但最好设置为1024的倍数,参考值32M。
2. 增加一行:query_cache_type=1
query_cache_type参数用于控制缓存的类型,注意这个值不能随便设置,必须设置为数字,可选项目以及说明如下:
如果设置为0,那么可以说,你的缓存根本就没有用,相当于禁用了。但是这种情况下query_cache_size设置的大小系统是否要为其分配呢,这个问题有待于测试?
如果设置为1,将会缓存所有的结果,除非你的select语句使用SQL_NO_CACHE禁用了查询缓存。
如果设置为2,则只缓存在select语句中通过SQL_CACHE指定需要缓存的查询。
OK,配置完后的部分文件如下:
query_cache_size=128M query_cache_type=1
保存文件,重新启动MYSQL服务,然后通过如下查询来验证是否真正开启了:
mysql> show variables like '%query_cache%'; +——————————+———–+ | Variable_name |Value | +——————————+———–+ | have_query_cache |YES | | query_cache_limit |1048576 | | query_cache_min_res_unit |4096 | | query_cache_size | 134217728| | query_cache_type |ON | | query_cache_wlock_invalidate | OFF | +——————————+———–+ 6 rows in set (0.00 sec)
主要看query_cache_size和query_cache_type的值是否跟我们设的一致:
这里query_cache_size的值是134217728,我们设置的是128M,实际是一样的,只是单位不同,可以自己换算下:134217728 = 128*1024*1024。
query_cache_type设置为1,显示为ON,这个前面已经说过了。
总之,看到上边的显示表示设置正确,但是在实际的查询中是否能够缓存查询,还需要手动测试下,我们可以通过show statuslike '%Qcache%';语句来测试,现在我们开启了查询缓存功能,在执行查询前,我们先看看相关参数的值:
mysql> show status like '%Qcache%'; +————————-+———–+ | Variable_name |Value | +————————-+———–+ | Qcache_free_blocks |1 | | Qcache_free_memory | 134208800| | Qcache_hits |0 |
以上就是mysql缓冲和缓存设置详解的内容,更多相关内容请关注PHP中文网(www.php.cn)!