• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

SQL语句效率有关问题

mysql 搞代码 7年前 (2018-05-31) 157次浏览 已收录 0个评论

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,或者说调用的算法不一样
这样导致的效率不同。


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:SQL语句效率有关问题

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址