我绝对不是特别擅长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秒。我该怎么做才能加快速度并提高子查询的效率?
答案 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
的查询容易受到攻击,请阅读下面的文章,了解如何防范它,