作家
登录

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

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

  1. alter table test_prefix_ind add key(blob_str(30));; 

看看大年夜小,544k(10064-9520)。

看看几个表的前缀长度和大年夜小。前缀长度明显降低了索引的大年夜小。

看看萌芽是否能正常进行:

可以应用上索引。

前缀索引长度的选择

对于一个可能挺长的栏位,怎么断定合适的前缀索引呢?

简单做法:

  1. Select count(distinct substr(long_str,1,5))/count(*) from test_prefix_ind; 

炫一点的写法,经由过程一些小技能,可以在同一个SQL里遍历多个值,同时查看多个值的选择度。

  1. select R,count(distinct substr(long_str,1,R))/count(*) 
  2.  
  3. from 
  4.  
  5. (SELECT @rownum:=ceil(@rownum*1.4) AS  R 
  6.  
  7.  FROM (SELECT @rownum:=1) r,test_prefix_ind limit 1,10 
  8.  
  9.  ) R,test_prefix_ind T 
  10.  
  11.  group by R;; 

我们创建一个前缀长度为5的前缀索引。

  1. alter table test_prefix_ind add key(long_str(5)); 

看看大年夜小,仅仅258k(10320-10064),远低于最早创建的8992k。

测试一下机能,有前缀索引时:

删除索引后,机能差距很明显:

Oracle的类似实现

早年面的做法中,我们可以发明,前缀索引本质上就是把栏位的前N位作为索引,这个看起来,很像Oracle的函数索引。类似于:

测验测验在类型为varchar(1000)的LONG_STR创建索引

  1. Create index index_name on table_name(substr(column_name,1,<length>) ); 

对于Oracle的函数索引,我们一个比较深的印象就是,where前提必须和函数索引里的表达式一致,才能应用上函数索引。但既然MySQL可以用前缀索引,作为老前辈的Oracle, 似乎应当也能实现才对。

我们来看看,在Oracle琅绫擎,是否可以或许实现同样的功能。

创建表格:

对于这个表,因为数据是随机的,所以,前5位已经足够好。

  1. Create table test_substr as 
  2.  
  3. select object_id,object_name||dbms_random.string('x',dbms_random.value(1,1000) as object_name,created from all_objects , 
  4.  

      推荐阅读

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

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


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

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

关键词: 探索发现

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

网友点评
自媒体专栏

评论

热度

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