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" 的期望结果将返回 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 秒。我能做些什么来加快速度并使我的子查询更有效率?

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

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

于 2012-12-18T03:35:47.170 回答