2

私は間違いなくMySQLに特に熟練していませんが、今まではそうである必要はありませんでした。私は大規模なデータベース、特に1500行以上のユーザーテーブルを扱っています。したがって、IN句で達成していたことを効率的に達成する方法を理解する必要があります。

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

SELECT * 
FROM artists_profile 
WHERE artist_name LIKE '%$test%' OR id IN (SELECT profile_id
              FROM artists_profileltp_join
            WHERE genre_id IN (SELECT id 
                               FROM artists_ltp 
                               WHERE genre LIKE '%$test%') OR  
                                     details LIKE '%$test%')

サンプルデータを含むデータベース

    artists_profile           artists_profileltp_join
+------+-------------+     +---------+------------+---------+
|  ID  | artist_name |     |genre_id | profile_id | details |
+------+-------------+     +---------+------------+---------+
|   1  | Jake        |     |     1   |       2    | rap     |
|   2  | Obama       |     |     2   |       3    | smooth  |
|   3  | Bob         |     |     1   |       1    | metal   |
+------+-------------+     +---------+------------+---------+
    artists_ltp
+------+-------+
|  ID  | genre |
+------+-------+
|   1  | rock  |
|   2  | jazz  |
+------+-------+

$ test = "ja"の望ましい結果は、Jakeが "ja"で始まり、Bobが "ja"を含むジャンルを再生するため、artist_profileID1および3を返します。

テーブルはとてもシンプルです。

Artists_profileには、ユーザーに関するすべての固有の情報が含まれています。Artists_profileltp_joinには、profile_id(int(11))、genre_id(int(11))、およびdetails(varchar(200))フィールドがあり、artists_profileテーブルをartists_ltpテーブルに結合するだけです。

Artists_ltpには、一意のIDとvarchar(50)フィールドがあります。クエリの実行には平均30秒かかります。これを高速化し、サブクエリをより効率的にするために何ができますか?

4

1 に答える 1

3
SELECT  DISTINCT a.*
FROM    artist_profile a
        INNER JOIN artists_profileltp b
            ON a.ID = b.profile_ID
        INNER JOIN artists_ltp  c
            ON b.genre_id = c.id
WHERE   c.genre LIKE '%$test%' OR
        c.details LIKE '%$test%'

JOINこれの方がいいでしょう。ただし、残念ながら、を使用INDEXしているため、クエリは使用されませんLIKE。に関する記事を読むことをお勧めしますFULL TEXT SEARCH

もう1つ、クエリは脆弱です。SQL Injectionそれを防ぐ方法については、以下の記事をお読みください。

于 2012-12-18T03:35:47.170 に答える