列名如“%%”和完全没有条件之间有区别吗?

时间:2011-02-24 08:39:14

标签: mysql query-optimization database-indexes

这两个查询是否存在差异(优化明智)?

select * from users;

select * from users where first_name like '%%' and last_name like '%%'

我正在使用传递的参数动态构建PHP中的查询。 所以,例如......

$first_name_str = "";
if($firstname)
{
    $first_name_str = "first_name = '%".$firstname."%' and";
}

$last_name_str = "";
if($lastname)
{
    $last_name_str = "last_name = '%".$lastname."%' and";
}


$query = 
"select
        *

from    
    users

where
    ".$first_name_str."
    ".$last_name_str."
    1=1";

我问这个的原因是因为我读到mysql在执行select时只使用一个索引。因此,如果我在firstname和lastname上有单独的索引,则只使用一个索引。如果我的查询为:

select * from users where first_name like '%%' and last_name like '%%'

默认情况下,我可以在first_name和last_name上添加连锁索引,搜索速度会快得多吗?

3 个答案:

答案 0 :(得分:2)

类似'%'与Like'%%'或Like'%%%'或LIKE'%%%%'相同。

要自己检查一下,只需对查询运行说明即可。我在桌子上运行了一些示例查询。

mysql> explain select * from USERS where EMAIL like '%';
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra       |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
|  1 | SIMPLE      | USERS | ALL  | NULL          | NULL | NULL    | NULL |  415 | Using where | 
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
1 row in set (0.02 sec)

mysql> explain select * from USERS where EMAIL like '%%';
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra       |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
|  1 | SIMPLE      | USERS | ALL  | NULL          | NULL | NULL    | NULL |  415 | Using where | 
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
1 row in set (0.00 sec)

mysql> explain select * from USERS where EMAIL like '%%%';
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra       |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
|  1 | SIMPLE      | USERS | ALL  | NULL          | NULL | NULL    | NULL |  415 | Using where | 
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
1 row in set (0.01 sec)
@Iain的2分是正确的表现方式。 但是尝试使用负载测试来定位分段中的大多数性能问题。

答案 1 :(得分:0)

大多数SQL服务器(我认为MySql就是其中之一)尽力使用LIKE关键字的索引。

对于大多数查询,使用LIKE '%'应该与无条件一样快。我不确定LIKE '%%'

但一般来说,在性能优化方面需要记住两件重要的事情:

  1. 除非是问题,否则不要担心
  2. 如果需要优化,请测量它(跟踪工具,分析器等)

答案 2 :(得分:0)

//编辑:你的问题的第一行已经读到了很晚,所以我错过了“优化明智”部分......现在我的答案有点偏离主题,但并非完全错误,所以我不会去删除它。也许有人觉得它很有用......

关于索引的许多事情已经说过了,所以我没有什么可补充的。

但另一个重点可能会或可能不会影响你的方式,取决于你的桌面设置:

LIKENULL的比较总是产生NULL,因此如果您的表中包含last_name或first_name为NULL的行,则WHERE <field> LIKE '%'(或'%%'或'%%%')不会返回此行(因为NULL LIKE '%'返回NULL,显然不是TRUE。)