重复测试很多次,与下面的结果基本一致。使用'_'代替第一个字符会得到两倍多点的效率,两个条件匹配到的是相同的记录。为什么会是这样的结果?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>

解决方案 »

  1.   

    NEWSN 开头的纪录只有 345536 条啊,
    至于速度上应该和 '%xxxxxx%'比'xxxxxx%'效率高是一样的道理
      

  2.   

    mysql> select count(*) from  regdb where sn like '_EWSN%';和
    mysql> select count(*) from  regdb where sn like 'NEWSN%';它们所匹配的字符串不是一样的,至于记录一样只是碰巧的而已,就是说你的表里sn字段的数据全部都NEWSN开头的,没有其他的数据例如是:AEWSN,BEWSN之类的数据,如果有的话,你试试记录数是不是一样的?它们所匹配的字符串不一样,效率当然会不一样的啦!
      

  3.   

    没有一个说到点子上的。'_EWSN%'是模糊匹配
    'NEWSN%'是精确匹配在我的表中,这两种方式匹配的是相同的记录。为什么模糊匹配比精确匹配效率高?
      

  4.   

    你的数据库是不是还有其他的优化措施?
    理论来说_EWSN%使用的是全表扫描
    NEWSN%这个是使用索引的
    _EWSN%不会比NEWSN%这个快的。
      

  5.   

    你从SN上建索引了。
    select count(*) from  regdb where sn like '_EWSN%'; 没有使用索引
    select count(*) from  regdb where sn like 'NEWSN%'; 查询分析器打算使用索引,但是发现基数太大,抛弃使用索引了。这个有一段过程,所以会慢,但是一般情况下,不会相差到0.6秒,肯定楼主的机器还在干其他的什么事情。
    这么说,明白了吗?
      

  6.   

    whalefish2001(whale) ( 一级(初级)) 你和我的想法一样
    不过有一点,mysql的文档上说,如果不使用索引,用全表扫描的话,MySQL使用Turbo Boyer-Moore算法初始化字符串的模式然后使用该模式来更快地进行搜索,可能在查询分析器放弃索引的时候,并没有调用Turbo Boyer-Moore来进行搜索,所以就变得慢了。
      

  7.   

    我的想法也是  NEWSN%这个是使用索引的, _EWSN%不会比NEWSN%这个快的。
    但事实上,_EWSN%速度快。
    我的电脑没有做别的,而且是很多次反复测试得出的结论。不能理解了,放弃索引反而会变快。我觉得索引是有用的,因为如果我在没有建索引的字段上搜索,所花的时间要多十倍以上。
      

  8.   

    ahjoe(强哥) 你建立了索引,在select的时候,是否使用索引,不是你说了算得,是数据库优化说了算,就如同whalefish2001(whale) 说的那样,返回的纪录数很大,那样,数据库会自动放弃
    使用索引,进行全表扫描来处理。
         现在你的情况应该是数据库放弃使用索引了。
         可能是我上面说的情况,原来不使用索引,会调用Turbo Boyer-Moore算法来select ,
    后来放弃使用索引,可能没有调用Turbo Boyer-Moore算法来select,或者说调用的算法不一样
    这样导致的效率不同。