重复测试很多次,与下面的结果基本一致。使用'_'代替第一个字符会得到两倍多点的效率,两个条件匹配到的是相同的记录。为什么会是这样的结果?mysql> select count(*) from regdb where sn like '_EWSN%';
+----------+
| count(*) |
+----------+
| 345536 |
+----------+
1 row in set (0.64 sec)mysql> select count(*) from regdb where sn like 'NEWSN%';
+----------+
| count(*) |
+----------+
| 345536 |
+----------+
1 row in set (1.36 sec)mysql>
+----------+
| count(*) |
+----------+
| 345536 |
+----------+
1 row in set (0.64 sec)mysql> select count(*) from regdb where sn like 'NEWSN%';
+----------+
| count(*) |
+----------+
| 345536 |
+----------+
1 row in set (1.36 sec)mysql>
至于速度上应该和 '%xxxxxx%'比'xxxxxx%'效率高是一样的道理
mysql> select count(*) from regdb where sn like 'NEWSN%';它们所匹配的字符串不是一样的,至于记录一样只是碰巧的而已,就是说你的表里sn字段的数据全部都NEWSN开头的,没有其他的数据例如是:AEWSN,BEWSN之类的数据,如果有的话,你试试记录数是不是一样的?它们所匹配的字符串不一样,效率当然会不一样的啦!
'NEWSN%'是精确匹配在我的表中,这两种方式匹配的是相同的记录。为什么模糊匹配比精确匹配效率高?
理论来说_EWSN%使用的是全表扫描
NEWSN%这个是使用索引的
_EWSN%不会比NEWSN%这个快的。
select count(*) from regdb where sn like '_EWSN%'; 没有使用索引
select count(*) from regdb where sn like 'NEWSN%'; 查询分析器打算使用索引,但是发现基数太大,抛弃使用索引了。这个有一段过程,所以会慢,但是一般情况下,不会相差到0.6秒,肯定楼主的机器还在干其他的什么事情。
这么说,明白了吗?
不过有一点,mysql的文档上说,如果不使用索引,用全表扫描的话,MySQL使用Turbo Boyer-Moore算法初始化字符串的模式然后使用该模式来更快地进行搜索,可能在查询分析器放弃索引的时候,并没有调用Turbo Boyer-Moore来进行搜索,所以就变得慢了。
但事实上,_EWSN%速度快。
我的电脑没有做别的,而且是很多次反复测试得出的结论。不能理解了,放弃索引反而会变快。我觉得索引是有用的,因为如果我在没有建索引的字段上搜索,所花的时间要多十倍以上。
使用索引,进行全表扫描来处理。
现在你的情况应该是数据库放弃使用索引了。
可能是我上面说的情况,原来不使用索引,会调用Turbo Boyer-Moore算法来select ,
后来放弃使用索引,可能没有调用Turbo Boyer-Moore算法来select,或者说调用的算法不一样
这样导致的效率不同。