インデックスなしで実行された結合を見つけるにはどうすればよいでしょうか?

インデックスなしで実行された結合を見つけるにはどうすればよいでしょうか?

私は Mariadb 10.6 で WordPress ウェブサイトを運営していますが、最近、Mysqltuner で「インデックスなしで結合が実行されました」というエラーが表示されました。

数値はそれほど大きくありませんが、Mysqltuner では Key_buffer_size を増やし続けることを推奨しています。

ただし、私の VPS には空きメモリがあまりないので、別の問題でこのエラーを解決しています。

数十個のプラグインがアクティブになっているので、どのプラグインが問題を引き起こしているのか確認したいと思います。

そこで、まずは以下のようにエラーログを有効にしました。

log-queries-not-using-indexes = 1
log_error = /var/log/mysql/mysql-error.log
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 3

そして一定時間が経過した後、pt-query-digest を実行してエラー ログを分析しました。

pt-query-digest /var/log/mysql/mysql-slow.log

しかし、他の問題はわかりません。

スロー ログ内の多数のクエリのうち、インデックスのない列と結合しようとしているクエリをどのように判断できますか?

データベースを知らないので、クエリを見ただけではわかりません。

答え1

インデックスなしで実行された結合のみを検索するには、

MySQLコマンドプロンプトから現在の値を特定し、スロークエリログにJPWIのみを1時間記録した後に正常に戻ることができるようにします。

SELECT @@long_query_time;
SELECT @@min_examined_row_limit;
      write down the above values
  
SET GLOBAL long_query_time=3600;  for a ONE MINUTE slow log trigger
SET GLOBAL min_examined_row_limit=1;   if the query reads one row, consider logging
SET GLOBAL log_queries_not_using_indexes=1;  to get the log you are needing

一時間後、

SET GLOBAL long_query_time=discovered above;
SET GLOBAL min_examined_row_limit=discovered above; 
SET GLOBAL log_queries_not_using_indexes=0;   # to turn OFF feature

FLUSH LOGS;

インデックスのないクエリについては、過去 1 時間のスロー クエリ ログを確認してください。

連絡先情報についてはプロフィールをご覧ください。追加のアドバイスが必要な場合はご連絡ください。

ほとんどの人は、スパゲッティが分離するのを避けるために、遅いクエリやインデックスのないクエリを記録しません。 何らかの形で健全性を保つために、どちらか一方を取得します。

(フォーマットは固定、編集には 6 文字必要)

答え2

MyISAMテーブルはありますか?ない場合は(そしてテーブルはすべきInnoDBの場合)より低い key_buffer_size30Mまで。

「インデックスなしの結合」は必ずしも問題ではありません。遅いクエリの方が重要です。スローログつまり、最も遅い、それが「インデックスなしの結合」であるかどうかに関係なく、pt-query-digestまたはmysqldumpslow -s t

WordPress のパフォーマンスを向上させるには、このプラグインを追加します。 WP インデックスの改善

関連情報