ホームページ >バックエンド開発 >PHPチュートリアル >500秒以上かかるmysql 300万のデータクエリを最適化するにはどうすればよいですか?

500秒以上かかるmysql 300万のデータクエリを最適化するにはどうすればよいですか?

WBOY
WBOYオリジナル
2016-06-23 14:23:321112ブラウズ

この投稿は dz215136304 によって 2013-08-15 11:33:52 に最終編集されました

Linux で 500 秒以上で mysql 300 万のデータ クエリを最適化する方法 (pid がインデックス付けされており、id が主キーです)


SELECT id,pid ,keyWords,shortUrl FROM キーワード WHERE pid=0 ORDER BY id DESC LIMIT 50






次のように説明してください:
mysql> explain SELECT id,pid,keyWords,shortUrl FROM  keywords  WHERE pid=0 ORDER BY id DESC LIMIT 50;+----+-------------+----------+------+---------------+------+---------+-------+---------+-----------------------------+| id | select_type | table    | type | possible_keys | key  | key_len | ref   | rows    | Extra                       |+----+-------------+----------+------+---------------+------+---------+-------+---------+-----------------------------+|  1 | SIMPLE      | keywords | ref  | pid           | pid  | 4       | const | 2452523 | Using where; Using filesort |+----+-------------+----------+------+---------------+------+---------+-------+---------+-----------------------------+1 row in set (8.18 sec)


また、なぜ mysql の CPU 使用率がこれほど高いのでしょうか?メモリ: 512M

設定ファイルは次のとおりです:

# Example MySQL config file for small systems.## This is for a system with little memory (<= 64M) where MySQL is only used# from time to time and it's important that the mysqld daemon# doesn't use much resources.## You can copy this file to# /etc/my.cnf to set global options,# mysql-data-dir/my.cnf to set server-specific options (in this# installation this directory is /usr/local/mysql/var) or# ~/.my.cnf to set user-specific options.## In this file, you can use all long options that a program supports.# If you want to know which options a program supports, run the program# with the "--help" option.# The following options will be passed to all MySQL clients[client]#password	= your_passwordport		= 3306socket		= /tmp/mysql.sock# Here follows entries for some specific programs# The MySQL server[mysqld]port		= 3306socket		= /tmp/mysql.sockskip-lockingkey_buffer = 16Kmax_allowed_packet = 1Mtable_cache = 4sort_buffer_size = 64Kread_buffer_size = 256Kread_rnd_buffer_size = 256Knet_buffer_length = 2Kthread_stack = 64Kdatadir=/www/mysql/datalog-slow-queries=/www/log/mysql/slowquery.loglong_query_time=2# Don't listen on a TCP/IP port at all. This can be a security enhancement,# if all processes that need to connect to mysqld run on the same host.# All interaction with mysqld must be made via Unix sockets or named pipes.# Note that using this option without enabling named pipes on Windows# (using the "enable-named-pipe" option) will render mysqld useless!# #skip-networkingserver-id	= 1# Uncomment the following if you want to log updates#log-bin=mysql-bin# Uncomment the following if you are NOT using BDB tables#skip-bdb# Uncomment the following if you are using InnoDB tables#innodb_data_home_dir = /usr/local/mysql/var/#innodb_data_file_path = ibdata1:10M:autoextend#innodb_log_group_home_dir = /usr/local/mysql/var/#innodb_log_arch_dir = /usr/local/mysql/var/# You can set .._buffer_pool_size up to 50 - 80 %# of RAM but beware of setting memory usage too high#innodb_buffer_pool_size = 16M#innodb_additional_mem_pool_size = 2M# Set .._log_file_size to 25 % of buffer pool size#innodb_log_file_size = 5M#innodb_log_buffer_size = 8M#innodb_flush_log_at_trx_commit = 1#innodb_lock_wait_timeout = 50[mysqldump]quickmax_allowed_packet = 16M[mysql]no-auto-rehash# Remove the next comment character if you are not familiar with SQL#safe-updates[isamchk]key_buffer = 8Msort_buffer_size = 8M[myisamchk]key_buffer = 8Msort_buffer_size = 8M[mysqlhotcopy]interactive-timeout

ディスカッションに返信(解決策)

pid、id複合インデックスを作成します。PIDは複合インデックスの前に、IDは最後にあります。複合インデックス番号の

ls +
余分な部分を見ると、 filesort の使用がパフォーマンス低下の大きな原因です。
その理由は、pid と id の一部による検索と並べ替えではインデックスが使用されないためです。
Add (pid, id の集約インデックス)

キーフィールドにインデックスを追加します。

ls +
おまけの部分を見ると、 filesort の使用がパフォーマンスを低下させる大きな原因です。
その理由は、pid と id の一部による検索と並べ替えにインデックスが使用されないためです。
(pid、id の集約インデックス) を追加します

具体的な命令は何ですか? 初心者はそれについてあまり知りません

複合インデックスの前に PID を付け、最後に ID を付けて、pid、id 複合インデックスを作成します。複合インデックス番号
具体的なコマンドの式は何ですか? 初心者にはよくわかりません

ls +

余分な部分を見ると、filesort の使用がパフォーマンスを低下させる大きな原因です。
その理由は、pid と id の一部による検索と並べ替えにインデックスが使用されないためです。
プラス (pid, id の集約インデックス)

主キー作成時にインデックスが自動で作成されるんじゃないの?

ls +
おまけの部分を見ると、 filesort を使用していることがパフォーマンスが低い大きな原因です。
その理由は、pid と id の一部による検索と並べ替えにインデックスが使用されないためです。
(pid, idの集約インデックス) を追加

主キーを作成するとインデックスは自動的に作成されませんか?

baidu 主キーインデックス、ジョイントインデックス

alter table xxx addindex pid_id (pid, id) ;

これは可能です 主キー インデックスがありません。そうでない場合、Explain はこのように表示されません

phpmyadmin ホームページにアクセスし、右側の [Show Runtime Information] をクリックします。 以下はテーブルの実行ステータスです。値の付いた赤い行を見て、その後ろにある説明に注目してください。これは、mysql を調整してパフォーマンスを最適化するのに役立ちます。


さらに、innodb または myisam のことですか?

myisam の場合は、調整してみてください。

key_buffer = 16K =》 key_buffer = 16M
table_cache = 4 =》 table_cache = 512
sort_buffer_size = 64K =》 sort_buffer_size = 2M
read_rnd_buffer_size = 256K =》 read_rnd_buffer_size = 2M

myisam_sort_buffer_size = 16M を追加します

次に、mysqld を再起動し、それから状況を見てください。 mysql の CPU 使用率が高すぎる場合は、無視しないでください。

pid はインデックス化されており、id は主キーです

なぜそんなに遅いのでしょうか? 意味がありません

pid と id の両方にインデックスがありますが、一度に 1 つしか使用できないため、結合インデックスを構築する必要があります。

パーティションを作成します。 。 。 。

Linux で 500 秒以上の mysql 300 万データ クエリを最適化する方法 (pid がインデックス付けされ、id が主キー)



SELECT id,pid,keyWords,shortUrl FROM キーワード WHERE pid=0 ORDER BY id DESC LIMIT 50
赤 一部のステートメントで問題が発生し、テーブル全体のスキャンが実行されましたが、インデックスを追加しても無駄でした。
赤い部分を外すだけです

試してみたところ、うまく動作しないようなので、作者はメーターを分割した方が良いかもしれません。

ID が自動的に編集される場合は、ステートメント内の ORDER BY id DESC を削除し、DESC で並べ替えるように my.cnf で設定し、直接確認します。

ジョイントインデックスを試してください

それ以外の場合は、サブクエリを使用してみてください

また、テーブルサイズはメモリサイズより大きいですか?

メモリは 512M で、システムが一部を使い果たし、MYSQL にはあまり残りません。

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