2012-02-19 11 views
0

いくつかの結合で次のmysql select-queryを使用しています。参加する多くのことのようです複数の結合とテーブル構造を持つMysql-db-select

SELECT * 

FROM table_news AS a 
    INNER JOIN table_cat AS b ON a.cat_id = b.id 
    INNER JOIN table_countries AS c ON a.country_id = c.id 
    INNER JOIN table_addresses AS d ON a.id = d.news_id 

WHERE a.deleted = 0 
    AND a.hidden = 0 
    AND a.cat_id = ".$search_cat." 
    AND a.country_id = ".$search_country." 
    AND a.title LIKE '%".$search_string."%' 
    OR a.deleted = 0 
    AND a.hidden = 0 
    AND a.cat_id = ".$search_cat." 
    AND a.country_id = ".$search_country." 
    AND a.subtitle LIKE '%".$search_string."%'" 

:これは以下のようにやや良いSELECTステートメントがどのように見えるべきかである場合、私は疑問に思って。テーブルbとテーブルcには3つまたは4つのフィールドしか含まれていませんが、結合の数が開始ページの検索をはるかに遅くするのではないかと思いますか?

テーブルd(通り、市など)のフィールドをメインテーブルに戻す方が良いでしょうか?このクエリは、このクエリが実行されるほとんどの時間に必要ですか?

事前にありがとう、 ジェイデン

答えて

0

私は3が参加したに何か問題が必ずしもないと思います。クエリが最適化されていることを確認するためにできることはいくつかあります。

まず、SELECT *を実行しないでください。代わりに、データベースから返すフィールドを明示的に指定する必要があります。

また、where節にあるすべてのフィールドと、参加するすべてのフィールドにインデックスを作成します。これは少しトレードオフになることがあります。たとえば、たくさんの書き込み操作をしている場合、毎回インデックスに書き込む必要があるため、ヒットします。

+0

ありがとうございました。私の疑問はありますが、メインテーブルからアドレスフィールドを分割すると、多くの意味があるのでしょうか?それぞれのindizes、私はすでにメインテーブルのフィールド "id"に対応するアドレステーブルのフィールド "news_id"にインデックスを追加しました。追加した後、mysqlハンドルが自動的に右にindizes? – jayden

+0

SELECT *は読みやすくするためのものです... – jayden

関連する問題