1

マイナーなパフォーマンスの問題など、エラーは発生していません。

EXPLAIN
SELECT
a.nid,
a.title,
a.uid,
b.parent,
b.weight,
c.name,
d.value
FROM table1 AS a INNER JOIN table2 AS b ON a.vid = b.vid AND a.status = 1
INNER JOIN table3 AS c ON c.uid = a.uid
INNER JOIN table4 AS d ON d.content_id = a.nid AND d.value_type = 'percent' AND d.function = 'average'

どのテーブルが参照されているかを見ると、すべて問題ありませんが、「値」フィールドのみを選択する必要があるtable4から、ALLが呼び出されています...

id  select_type     table   type      possible_keys                                   key     key_len   ref                   rows  Extra
1   SIMPLE          a     ref     PRIMARY,vid,status,uid,node_status_type,nid   status  4         const                 1    
1   SIMPLE          b     eq_ref    PRIMARY                                         PRIMARY 4         databasename.a.vid    1    
1   SIMPLE          c     eq_ref    PRIMARY                                         PRIMARY 4         databasename.a.uid    1   Using where
1   SIMPLE          d     ALL     NULL                                          NULL      NULL      NULL                  2     Using where

ご覧のとおり、最終テーブル (d) から * を選択しています。そこから選択された 1 つのフィールドだけが必要なのに、なぜこれを行うのですか? 誰でも私を助けることができますか?

4

3 に答える 3

6

ALLすべての列ではなく、すべての行を意味します。可能なキーがないと言っているので、d.content_id、d.value_type、またはd.functionにインデックスがないと思います。

派手にしたい場合は、これらの 3 つの列すべてにインデックスを配置できます。

于 2009-01-06T22:26:38.567 に答える
2

d.value_type および d.function はインデックス付きフィールドですか? それは原因についての最初の本能でしょう。

于 2009-01-06T22:26:48.163 に答える
1

、、および列にtable4基づいて、複数列のインデックスを追加します。content_typevalue_typefunction

クエリはからすべての列を選択するのではなく、table4すべての行を選択します。2つしかない場合、これはそれほど問題にはなりません。

MySQLクエリ実行プランでは、少数のレコードを操作しているときに期待する答えが得られない場合があることに注意してください。このような状況では、データベースが全表スキャンを実行する方が高速になる可能性があります。

于 2009-01-08T07:26:28.510 に答える