作家
登录

MySQL的前缀索引及Oracle的类似实现

作者: 来源: 2018-01-19 08:54:27 阅读 我要评论

  • (select * from dual connect by level < 100) 
  •  
  • where rownum < 10000;  
  • 创建substr的函数索引:

    换成绑定变量看看:

    1. Create index test_substr_inx on test_substr(substr(object_name,1,5)); 

    看看履行筹划:

    我们可以看到,找谓词中,增长了一个本来竽暌癸句中没有的器械:

    可以看到,谓词中变成了:

    为什么多了这个器械?因为,大年夜逻辑上来说:

    1. select * from test_substr where object_name=:a; 

    1. select * from test_substr where object_name=:a and substr(object_name,1,5)=substr(:a,1,5); 

    我们最后再看另一个例子。

    是百分百等价的。Oracle相当于主动做了语义上的优化。

    1. select * from  test_scale where object_name = 'DBA_TABLES'
    1. SELECT * FROM TEST_SUBSTR WHERE OBJECT_NAME=:A AND SUBSTR(OBJECT_NAME,1,5)=SUBSTR(:A,1,5); 

    看看如不雅创建通俗索引,空寄┞芳用是若干。

    1. Create index test_substr_inx2 on test_substr(object_name); 

    大年夜小分别是7M和256K.

    但Oracle仅止于此吗?我们在来尝尝看另一个SQL, 此次,我们在前提上也应用substr,然则长度不为5。

    不雅然照样可以的。因为逻辑上来说

    1. select * from test_substr where substr(object_name,1,<N>)=:a;  

    在N>=5的时刻,

    照样等价的。所以优化器照样可以持续加一个谓词。

    当然,如不雅把WHERE前提中substr换成小于5的值,就不再能用得上索引。因为无法直接换为等价的、又带有substr(object_name,1,5)的语句。

    Oracle时光、数字上的前缀索引

    仅仅就如许吗?除了字符类型之外,数字类型和时光类型是否也支撑?

    我们再看看。

    在刚才的表的基本上,创建时光类型上的trunc函数索引。

    1. select * from test_substr 
    2.  
    3. where substr(object_name,1,<N>)=:a and substr(object_name,1,5)=substr(:a,1,5); 

    看看履行筹划:

    起首,创建一个生成跨越1000长度的随机字符串的函数。


      推荐阅读

      Memory Cleaner——简单好用的Windows内存优化工具

    年前最后一场技巧盛宴 | 1月27日与京东、日记易技巧大年夜咖畅聊智能化运维成长趋势!Windows 操作体系在没有效户干涉的情况下可以相当有效地治理计算机内存的应用情况,但不是说就没有可以优化和改进的>>>详细阅读


    本文标题:MySQL的前缀索引及Oracle的类似实现

    地址:http://www.17bianji.com/lsqh/40347.html

    关键词: 探索发现

    乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

    网友点评
    自媒体专栏

    评论

    热度

    精彩导读
    栏目ID=71的表不存在(操作类型=0)