日期:2014-05-16  浏览次数:20810 次

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

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>

------解决方案--------------------
因为以_开头的少些,而以n开头的可能更多些。
比如要你去找一个人,告诉你是一个女人,或者告诉你,是一个长头发的。后者当然会快些。
------解决方案--------------------
会不会是缓存的关系?你调换下次序执行过?
------解决方案--------------------
不会吧?
重起机器然后测试,测试一个后,重起再测试另一个。
看看还是这个结果么?

------解决方案--------------------
你从SN上建索引了。
------解决方案--------------------
NEWSN 开头的纪录只有 345536 条啊,
至于速度上应该和 '%xxxxxx% '比 'xxxxxx% '效率高是一样的道理
------解决方案--------------------
mysql> select count(*) from regdb where sn like '_EWSN% ';和
mysql> select count(*) from regdb where sn like 'NEWSN% ';它们所匹配的字符串不是一样的,至于记录一样只是碰巧的而已,就是说你的表里sn字段的数据全部都NEWSN开头的,没有其他的数据例如是:AEWSN,BEWSN之类的数据,如果有的话,你试试记录数是不是一样的?它们所匹配的字符串不一样,效率当然会不一样的啦!
------解决方案--------------------
你的数据库是不是还有其他的优化措施?
理论来说_EWSN%使用的是全表扫描
NEWSN%这个是使用索引的
_EWSN%不会比NEWSN%这个快的。
------解决方案--------------------
还有一种可能,你的表的纪录总数是多少条?

------解决方案--------------------
你从SN上建索引了。


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

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