1

クエリを最適化しようとしていますが、「EXPLAIN」に到達するとすべてうまく見えますが、それでも「log_queries_not_using_index」に表示されます。

クエリは次のとおりです。

SELECT t1.id_id,t1.change_id,t1.like_id,t1.dislike_id,t1.user_id,t1.from_id,t1.date_id,t1.type_id,t1.photo_id,t1.mobile_id,t1.mobiletype_id,t1.linked_id 
FROM recent AS t1 
LEFT JOIN users AS t2 ON t1.user_id = t2.id_id 
WHERE t2.active_id=1 AND t1.postedacommenton_id='0'  AND t1.type_id!='Friends' 
ORDER BY t1.id_id DESC LIMIT 35;

したがって、「ウォールポスト」データのように取得し、USERSテーブルに参加して、ユーザーがまだアクティブユーザー(番号1)であり、他の2つの小さな「AND」であることを確認しました。

phpmyadminのEXPLAINでこれを実行すると、次のように表示されます

id | select_type | テーブル| タイプ| possible_keys | キー| key_len | ref | 行| 追加
1 | シンプル| t1 | インデックス| user_id | プライマリー| 4 | NULL | 35 | 場所を使用する
1 | シンプル| t2 | eq_ref | PRIMARY、active_id | プライマリー| 4 | hnet_user_info.t1.user_id | 1 | 場所を使用する

これは、t1クエリが「WHERE」を使用して35行を検出し、t2クエリが「WHERE」を使用して1行(ユーザー)を検出したことを示しています。

そのため、log_queries_not_using_indexレポートに表示される理由がわかりません。

任意のヒント?必要に応じて、さらに情報を投稿できます。

4

1 に答える 1

2

tldr; 「インデックス警告を使用しない」は無視してください。1.3ミリ秒のクエリ実行時間は問題ではありません。ここで最適化するものは何もありません。パフォーマンスプロファイル全体を見て、ボトルネックを見つけてください。

データベースエンジンを信頼します。データベースクエリプランナーは、インデックスを使用することが有益であると判断した場合にインデックスを使用します。この場合、カーディナリティの見積もりが低い(35x1)ため、クエリプランナーは実際の実行プランにインデックスを使用する理由はないと判断しました。このような些細なケースでインデックスが使用された場合、実際にはクエリの実行時間が長くなる可能性があります。

いつものように、97/3ルールを使用します。

于 2013-01-11T05:28:07.563 に答える