【发布时间】:2014-12-08 20:11:10
【问题描述】:
$networks 是具有多个值的字符串,以逗号分隔。 示例:
$networks = "Programming,Movies,Hollywood". (There can be around 150 values or more.)
现在 Mysql 查询到这里了:
$query = "SELECT * FROM table
WHERE ( isActive = 1 AND
isDeleted = 0 AND
onid = '0' AND
question = 0 AND
( ".$networkqur." )
)
ORDER BY id DESC
LIMIT 0,100;
这里 $networkqur 是:
$network = explode(',',$networks);
$networkqur = '';
for( $i = 0; $i < count($network); $i++ ){
$networkqur .= 'networks LIKE "%'.$network[$i].'%"';
if( $i != count($network) - 1 ){
$networkqur .= ' OR ';
}
}
所以 $networkqur 变成了:
$networkqur = "networks LIKE "%Programming%" OR
networks LIKE "%Movies%" OR
networks LIKE "%Hollywood%";
有效的查询变成了:
$query = "SELECT * FROM posts
WHERE ( isActive = 1 AND
isDeleted = 0 AND
onid = '0' AND
question = 0 AND
( networks LIKE "%Programming%" OR
networks LIKE "%Movies%" OR
networks LIKE "%Hollywood% )
)
ORDER BY id DESC
LIMIT 0,100;
现在我们可以看到,查询中可以有 150 个 OR 条件和多个 AND 条件,最后是排序。
是否可以替换此特定查询或任何其他更快的方法来执行它?
【问题讨论】:
-
您需要将
networks拆分到自己的表中并开始使用JOINs 和IN -
^ 但是你不认为闯入其他表会增加复杂性和时间吗?
-
我认为没有更快的解决方案。您可以使用正则表达式,但我认为它甚至会慢一些(但在这种情况下更容易编写)。
-
您正在使用
LIKE '%...%'您几乎无法做任何事情来加速这些查询——它们不能使用索引。您应该改用全文搜索,至少可以对其进行索引。 -
这是另一个“我正在打破First Normal Form,现在它让我的生活变得悲惨。我如何让它更快/更容易/更简单?”问题。与往常一样,答案是不要破坏第一范式。