这两个查询是否存在差异(优化明智)?
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上添加连锁索引,搜索速度会快得多吗?
答案 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 '%%'
但一般来说,在性能优化方面需要记住两件重要的事情:
答案 2 :(得分:0)
//编辑:你的问题的第一行已经读到了很晚,所以我错过了“优化明智”部分......现在我的答案有点偏离主题,但并非完全错误,所以我不会去删除它。也许有人觉得它很有用......
关于索引的许多事情已经说过了,所以我没有什么可补充的。
但另一个重点可能会或可能不会影响你的方式,取决于你的桌面设置:
LIKE
与NULL
的比较总是产生NULL
,因此如果您的表中包含last_name或first_name为NULL的行,则WHERE <field> LIKE '%'
(或'%%'或'%%%')不会返回此行(因为NULL LIKE '%'
返回NULL
,显然不是TRUE
。)