MySQL中的高效子查询

时间:2012-12-18 03:28:46

标签: mysql sql database performance

我绝对不是特别擅长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”的所需结果将返回artist_profile ID 1和3,因为Jake以“ja”开头,Bob播放包含“ja”的类型。

表非常简单。

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秒。我该怎么做才能加快速度并提高子查询的效率?

1 个答案:

答案 0 :(得分: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

的文章

还有一件事,SQL Injection的查询容易受到攻击,请阅读下面的文章,了解如何防范它,