5

MySQL を使用して情報を保存する XMPP アプリケーションがあります。これまでのところ、特定の負荷の問題は発生していませんが、最悪の場合 (またはユーザーに関しては最高の場合;)) に備えようとしています。

この MySQL サーバーがインストールされているホストは、2GB の RAM を持つ Slicehost スライスです。

昨日、遅いクエリのログを有効にして、実際に何も遅くないことを確認しました。残念ながら、実際には多くの遅いクエリが見つかったようです。

/var/log/mysql/mysql-slow.log からの mysql スロー クエリ ログの読み取り
Count: 109 Time=25.57s (2787s) Lock=0.00s (0s) Rows=1.0 (109), xxxxx[xxxxx]@[172.21.xxx.xxx]
  SELECT * FROM `feeds` WHERE (`id` = 'S') LIMIT N

IDは実際には主キーであるため、これは私にとって本当に奇妙です...テーブルはInnoDBです

私は説明しました:

mysql> EXPLAIN SELECT * FROM `feeds` WHERE (`id` = '2650') LIMIT 1;

 +----+-------------+-------+-------+-------------- --+---------+---------+-------+------+-------+
 | | ID | select_type | テーブル | タイプ | 可能な_キー | キー | key_len | 参照 | 行 | 行 エクストラ |
 +----+-------------+-------+-------+-------------- --+---------+---------+-------+------+-------+
 | | 1 | シンプル | フィード | 定数 | プライマリ | プライマリ | 4 | 定数 | 1 | | |
 +----+-------------+-------+-------+-------------- --+---------+---------+-------+------+-------+
 セットで 1 行 (0.00 秒)

これが起こるのには別の理由があるはずです。また、ログには実際に同様のスロー クエリ (主キーを使用するクエリ) が多数あります。

ここにMySQL設定を投稿するのは理にかなっていると思います:

mysql> 変数を表示;
+---------------------------------+--------------- --------------+
| | 変数名 | 値 |
+---------------------------------+--------------- --------------+
| | auto_increment_increment | 1 |
| | auto_increment_offset | 1 |
| | automatic_sp_privileges | オン |
| | back_log | 50 |
| | ベースディレクトリ | /usr/ |
| | binlog_cache_size | 32768 |
| | bulk_insert_buffer_size | 8388608 |
| | character_set_client | ラテン1 |
| | character_set_connection | ラテン1 |
| | character_set_database | ラテン1 |
| | character_set_filesystem | バイナリ |
| | character_set_results | ラテン1 |
| | character_set_server | ラテン1 |
| | character_set_system | utf8 |
| | character_sets_dir | /usr/share/mysql/charsets/ |
| | 照合接続 | latin1_swedish_ci |
| | 照合データベース | latin1_swedish_ci |
| | 照合サーバー | latin1_swedish_ci |
| | 補完タイプ | 0 |
| | 同時挿入 | 1 |
| | 接続タイムアウト | 10 |
| | データディレクトリ | /var/lib/mysql/ |
| | 日付形式 | %Y-%m-%d |
| | 日時フォーマット | %Y-%m-%d %H:%i:%s |
| | default_week_format | 0 |
| | delay_key_write | オン |
| | 遅延挿入制限 | 100 |
| | 遅延挿入_タイムアウト | 300 |
| | 遅延キュー サイズ | 1000 |
| | div_precision_increment | 4 |
| | keep_files_on_create | オフ |
| | engine_condition_pushdown | オフ |
| | expire_logs_days | 10 |
| | フラッシュ | オフ |
| | フラッシュ時間 | 0 |
| | ft_boolean_syntax | + -><()~*:""&| | |
| | ft_max_word_len | 84 |
| | ft_min_word_len | 4 |
| | ft_query_expansion_limit | 20 |
| | ft_stopword_file | (組み込み) |
| | group_concat_max_len | 1024 |
| | have_archive | はい |
| | have_bdb | いいえ |
| | have_blackhole_engine | はい |
| | have_compress | はい |
| | have_crypt | はい |
| | have_csv | はい |
| | have_dynamic_loading | はい |
| | have_example_engine | いいえ |
| | have_federated_engine | 無効 |
| | have_geometry | はい |
| | have_innodb | はい |
| | have_isam | いいえ |
| | have_merge_engine | はい |
| | have_ndbcluster | 無効 |
| | have_openssl | 無効 |
| | have_ssl | 無効 |
| | have_query_cache | はい |
| | have_raid | いいえ |
| | have_rtree_keys | はい |
| | have_symlink | はい |
| | ホスト名 | スーパーフィーダーデータベース |
| | init_connect | | |
| | 初期化ファイル | | |
| | init_slave | | |
| | innodb_additional_mem_pool_size | innodb_additional_mem_pool_size | 1048576 |
| | innodb_autoextend_increment | 8 |
| | innodb_buffer_pool_awe_mem_mb | innodb_buffer_pool_awe_mem_mb | 0 |
| | innodb_buffer_pool_size | innodb_buffer_pool_size | 1073741824 |
| | innodb_checksums | オン |
| | innodb_commit_concurrency | innodb_commit_concurrency | 0 |
| | innodb_concurrency_tickets | innodb_concurrency_tickets | 500 |
| | innodb_data_file_path | innodb_data_file_path | ibdata1:10M:自動拡張 |
| | innodb_data_home_dir | innodb_data_home_dir | | |
| | innodb_adaptive_hash_index | innodb_adaptive_hash_index | オン |
| | innodb_doublewrite | オン |
| | innodb_fast_shutdown | innodb_fast_shutdown | 1 |
| | innodb_file_io_threads | innodb_file_io_threads | 4 |
| | innodb_file_per_table | innodb_file_per_table | オン |
| | innodb_flush_log_at_trx_commit | innodb_flush_log_at_trx_commit | 2 |
| | innodb_flush_method | innodb_flush_method | O_DIRECT |
| | innodb_force_recovery | innodb_force_recovery | 0 |
| | innodb_lock_wait_timeout | innodb_lock_wait_timeout | 50 |
| | innodb_locks_unsafe_for_binlog | innodb_locks_unsafe_for_binlog | オフ |
| | innodb_log_arch_dir | | |
| | innodb_log_archive | オフ |
| | innodb_log_buffer_size | 4194304 |
| | innodb_log_file_size | 5242880 |
| | innodb_log_files_in_group | 2 |
| | innodb_log_group_home_dir | ./ |
| | innodb_max_dirty_pages_pct | innodb_max_dirty_pages_pct | 90 |
| | innodb_max_purge_lag | innodb_max_purge_lag | 0 |
| | innodb_mirrored_log_groups | innodb_mirrored_log_groups | 1 |
| | innodb_open_files | 300 |
| | innodb_rollback_on_timeout | innodb_rollback_on_timeout | オフ |
| | innodb_support_xa | innodb_support_xa | オン |
| | innodb_sync_spin_loops | innodb_sync_spin_loops | 20 |
| | innodb_table_locks | innodb_table_locks | オン |
| | innodb_thread_concurrency | innodb_thread_concurrency | 8 |
| | innodb_thread_sleep_delay | innodb_thread_sleep_delay | 10000 |
| | interactive_timeout | 28800 |
| | join_buffer_size | 131072 |
| | key_buffer_size | 16777216 |
| | key_cache_age_threshold | 300 |
| | key_cache_block_size | 1024 |
| | key_cache_division_limit | 100 |
| | 言語 | /usr/share/mysql/英語/ |
| | large_files_support | オン |
| | large_page_size | 0 |
| | 大きいページ | オフ |
| | lc_time_names | ja_JP |
| | ライセンス | GPL |
| | local_infile | オン |
| | ロックされたメモリ内 | オフ |
| | ログ | オフ |
| | log_bin | オフ |
| | log_bin_trust_function_creators | オフ |
| | log_error | | |
| | log_queries_not_using_indexes | オン |
| | log_slave_updates | オフ |
| | log_slow_queries | オン |
| | log_warning | 1 |
| | long_query_time | 3 |
| | low_priority_updates | オフ |
| | lower_case_file_system | オフ |
| | lower_case_table_names | 0 |
| | max_allowed_pa​​cket | 16777216 |
| | max_binlog_cache_size | 18446744073709547520 |
| | max_binlog_size | 104857600 |
| | max_connect_errors | 10 |
| | max_connections | 2000年 |
| | max_delayed_threads | 20 |
| | max_error_count | 64 |
| | max_heap_table_size | 16777216 |
| | max_insert_delayed_threads | 20 |
| | max_join_size | 18446744073709551615 |
| | max_length_for_sort_data | 1024 |
| | max_prepared_stmt_count | 16382 |
| | max_relay_log_size | 0 |
| | max_seeks_for_key | 18446744073709551615 |
| | max_sort_length | 1024 |
| | max_sp_recursion_depth | 0 |
| | max_tmp_tables | 32 |
| | max_user_connections | 0 |
| | max_write_lock_count | 18446744073709551615 |
| | multi_range_count | 256 |
| | myisam_data_pointer_size | 6 |
| | myisam_max_sort_file_size | 9223372036853727232 |
| | myisam_recover_options | バックアップ |
| | myisam_repair_threads | 1 |
| | myisam_sort_buffer_size | 8388608 |
| | myisam_stats_method | myisam_stats_method | nulls_不等 |
| | ndb_autoincrement_prefetch_sz | 1 |
| | ndb_force_send | オン |
| | ndb_use_exact_count | オン |
| | ndb_use_transactions | オン |
| | ndb_cache_check_time | 0 |
| | ndb_connectstring | | |
| | net_buffer_length | 16384 |
| | net_read_timeout | 30 |
| | net_retry_count | 10 |
| | net_write_timeout | 60 |
| | 新しい | オフ |
| | 古いパスワード | オフ |
| | open_files_limit | 10000 |
| | optimizer_prune_level | 1 |
| | optimizer_search_depth | 62 |
| | pid_file | /var/run/mysqld/mysqld.pid |
| | plugin_dir | | |
| | ポート | 3306 |
| | preload_buffer_size | 32768 |
| | プロファイリング | オフ |
| | profiling_history_size | 15 |
| | プロトコル_バージョン | 10 |
| | query_alloc_block_size | 8192 |
| | query_cache_limit | 1048576 |
| | query_cache_min_res_unit | 4096 |
| | query_cache_size | 16777216 |
| | query_cache_type | オン |
| | query_cache_wlock_invalidate | オフ |
| | query_prealloc_size | 8192 |
| | range_alloc_block_size | 4096 |
| | read_buffer_size | 131072 |
| | 読み取り専用 | オフ |
| | read_rnd_buffer_size | 262144 |
| | リレーログ | | |
| | リレー ログ インデックス | | |
| | リレーログ情報ファイル | リレー-log.info |
| | リレー ログ パージ | オン |
| | Relay_log_space_limit | 0 |
| | rpl_recovery_rank | 0 |
| | セキュア認証 | オフ |
| | secure_file_priv | | |
| | サーバー ID | 0 |
| | スキップ_外部ロック | オン |
| | スキップ_ネットワーキング | オフ |
| | スキップ_ショー_データベース | オフ |
| | スレーブ_圧縮_プロトコル | オフ |
| | スレーブ_ロード_tmpdir | /tmp/ |
| | slave_net_timeout | 3600 |
| | slave_skip_errors | オフ |
| | slave_transaction_retries | 10 |
| | slow_launch_time | 2 |
| | ソケット | /var/run/mysqld/mysqld.sock |
| | sort_buffer_size | 2097144 |
| | sql_big_selects | オン |
| | sql_mode | | |
| | sql_notes | オン |
| | sql_warnings | オフ |
| | ssl_ca | | |
| | ssl_capath | | |
| | ssl_cert | | |
| | ssl_cipher | | |
| | ssl_key | | |
| | ストレージ エンジン | MyISAM |
| | sync_binlog | 0 |
| | sync_frm | オン |
| | システムタイムゾーン | 協定世界時 |
| | テーブルキャッシュ | 64 |
| | table_lock_wait_timeout | 50 |
| | テーブルタイプ | MyISAM |
| | thread_cache_size | 8 |
| | スレッドスタック | 131072 |
| | 時間形式 | %H:%i:%s |
| | タイムゾーン | システム |
| | timed_mutex | オフ |
| | tmp_table_size | 33554432 |
| | tmpdir | /tmp |
| | transaction_alloc_block_size | 8192 |
| | transaction_prealloc_size | 4096 |
| | tx_isolation | READ-COMMITTED |
| | update_views_with_limit | はい |
| | バージョン | 5.0.67-0ubuntu6-ログ |
| | バージョンコメント | (Ubuntu) |
| | バージョン_コンパイル_マシン | x86_64 |
| | version_compile_os | debian-linux-gnu |
| | 待機タイムアウト | 28800 |
+---------------------------------+--------------- --------------+
セットで 237 行 (0.00 秒)

リクエストのほとんどは「ベーシック」ですが、ものすごいスピードが必要です!

実際にMySQLが非常に遅くなる原因について何か考えはありますか?

[概要] さまざまな回答を要約すると、次のようになります。

  • "LIMIT" を削除し、WHERE id = "X" を WHERE id = X に変更します
  • 多くのリソースを消費するスクリプト (バックアップなど) が時々実行されないことを確認してください。
  • 「ホスト」が実際の原因ではないことを確認してください。
4

8 に答える 8

3

低速の平均と分散を見ると、VM ホスト マシンに問題があります (残念ながら、これは制御できません)。

メモリ/ディスク I/O を指摘している人にとっては、これらの数値は大きすぎます。ディスクは数秒ではなく、100 ミリ秒で返されます。

于 2009-06-10T16:50:32.560 に答える
1

この問題は以前にも見たことがあります。

インデックスは整数フィールドにあり、 where 句のキーはstringです。あなたのインデックスは、型変換を引き起こしているという事実によって打ち負かされています。where 句でキーの引用符を外します。

mysql がこのように動作することに非常に驚きました。これがいつ発生しているのかを検出できないのは非常に残念です。

于 2009-06-10T17:29:23.870 に答える
1

残念ながら、私は昨年、この種のことで多くの経験を積むようになりました。

CPU/ディスクの遅延の問題である可能性がある他の人に同意します(仮想ホスティングによる)。ホストからディスク レイテンシの数値を取得する方法はありますか? ひょっとしたらスパイクもあるかもしれません。

limit 句を指定し、インデックスを引用するという点で、クエリが少し奇妙であることにも同意します。SELECT * ビットは完全に理解できます。

InnoDB には十分なメモリがないと思いますが、行数が非常に少なく、InnoDB に 1 ギガを与えているので、そうではありません。

クエリが間違っていると思います。以前、MySQL がこの種のことを行うのを見たことがあります。一部のクエリは時間がかかりすぎるか、他のクエリがスタックし始めます。しかし、時間がかかりすぎるクエリは、それほど時間がかからない単純で小さなものです。

いくつか提案があります。

  • テーブルをロックしている可能性のある自動バックアップが実行されていますか?
  • これは、定期的または予測可能な間隔で発生しますか?
  • これが発生したときに、ログインして完全なプロセス リストを見たことがありますか?
  • 特定の何かと一致しますか (人々が特定のレポートを実行するときなど)?
  • クエリの作業中にすべてのメモリを占有する可能性のある非常に大きなテーブルがあり、このテーブルが入ってこない (可能性は低い) ことはありませんか?
  • これは常にそうでしたか?最近始まったの?MySQL のバージョンは変更されましたか? MySQL の別のビルド (新しいポイント リリース、Percona Performance ビルドなど) を試すことができますか?

これが行われている間、完全なプロセス リストを見ることが最も役立つ場合があります。

昨年、この種の問題に遭遇したとき、最終的に真の問題を突き止めたのはプロセス リストを見ていました。

于 2009-06-10T17:03:49.117 に答える
1

クエリは非常に単純で、id が主キーであることを考えると、通常の状況では、巨大なテーブルであってもそれほど長くかかることはありません。推測ですが、サーバーに問題があるのでしょうか?私が理解しているように (彼らのホームページを 30 秒見てから)、Slicehost はより強力なサーバーの仮想マシン「スライス」を提供しています。同じサーバー上の他のスライスが時々大量のディスク読み取りを行っており、一時的にすべてのリソースを盗んでいる可能性がありますか? または、管理者が他のユーザーのためにマシンからスライスを作成/削除するときに発生する可能性があります。

これは非常に頻繁に発生しますか?

于 2009-06-10T16:45:09.900 に答える
1

id が主キーの場合、なぜ LIMIT 句を追加するのですか?

* を使用する代わりに、必要な列名を指定してみましたか?

また、ID列はintですか?1 の代わりに '1' を指定すると、インデックスを使用していない可能性があります。

試す

SELECT * FROM Feeds WHERE id = 1

それよりも

SELECT * FROM Feeds WHERE id = '1'

コメント用に編集

私の意見では、列名を明示的に指定することをお勧めします。これは、アプリで不要な列を将来そのテーブルに追加する必要がある場合があるためです。その時点で、必要以上のデータを取得し始めます。

于 2009-06-10T16:32:08.133 に答える
0

テーブルがメモリ キャッシュに保持できるサイズよりも大きい場合、これらのクエリの一部が、他の何かがそれらに多くの負荷をかけている不​​運な瞬間にディスクにアクセスする必要があった可能性があります。

MySQL のチューニングは、黒魔術のようなものになる場合があります。キーバッファキャッシュの競合が多いと、速度が著しく低下することもあります。

また、 mysql パフォーマンス ブログを検索して、手がかりともっともらしい理論を探すこともできます。

于 2009-06-10T16:39:54.560 に答える
-1

MyISAM を使用している場合、同時実行の問題が発生している可能性があります。

于 2009-06-10T16:39:48.947 に答える