利用索引覆盖95%的数据

获得字符串列索引前缀长度

大家都知道索引可以极大的加快查询的速度,但是索引也是有代价的,它需要消耗额外的存储空间,对数据的更新操作也涉及到对应索引的一致性更新。

而对某些特殊的字符串索引来说,我们并不一定要整个字段长度都索引起来,只需要索引一定的前缀大小就可以达到快速查找指定数据的目的。

比如name字段记录的是人的名字,定义为:

name varchar(128) NOT NULL DEFAULT '' COMMENT '姓名'

之所以定义为这么长,是为了适应国外超长的名字。有兴趣的同学可以google一下“世界最长人名”。

但是正常的人名其实并不长,所以我们只需要索引前几个就行了。

所以如何确定索引的长度以保证更好的选择性,前缀性也是很多人研究的课题和论文题目。如果你把整个列都索引起来,对应的选择性当然非常高,但是浪费的空间却非常多;如果只索引列的部分前缀,那么有可能选择性比较差,达不到通过索引提高查询速度的目的。

我们这里不分析也不介绍现有的确定索引前缀长度的方法:) 仅仅介绍一种获得索引前缀长度的方法,它能保证95%的列数据都能索引起来。

按照Dixon的理论,一般来说,你如果索引了95%的字符串前缀,它就可以满足大部分情况过滤需求。

对应的我们可以采用这样的sql来获得我们需要的95%字符前缀长度:

select min(cc.l) as ninty_five_percentfrom (select length(filename) as l, count(distinct filename) as c, @ccount := @ccount + count(distinct filename) as tfrom filenames, (select @ccount := 0) as foogroup by length(filename)) as cc where cc.t >= (@ccount*0.95) order by cc.t;

例如:

现在有一个filename表

[5.6.10-log root@woqu-mysql3 /root root@127.0.0.1:test 15:31:09>show create table filenames\G*************************** 1. row ***************************Table: filenamesCreate Table: CREATE TABLE `filenames` (`id` int(11) NOT NULL,`filename` varchar(255) NOT NULL,PRIMARY KEY (`id`),KEY `filename` (`filename`)span>) ENGINE=InnoDB DEFAULT CHARSET=latin11 row in set (0.00 sec)

该表有10条数据如下:

[5.6.10-log root@woqu-mysql3 /root root@127.0.0.1:test 15:30:43>select * from filenames;+----+-----------------------+| id | filename |+----+-----------------------+| 1 | sdfsdf || 4 | sdfsdsf32sf || 3 | sdfsdsfds3fsf || 8 | sdfsf || 2 | sdfsfsf || 5 | sdsf2f32sf || 9 | sdsf2sffff || 10 | sdsf2sffffdsjjjjjf || 7 | sdsf2sfffffsdfsdfsfsf || 6 | sdsf2sffffsf |+----+-----------------------+10 rows in set (0.00 sec)

我们按照dixon的要求,需要给filename列找到一个最佳的前缀长度,就可以这样来查询:

[5.6.10-log root@woqu-mysql3 /root root@127.0.0.1:test 15:31:38>select min(cc.l) as ninty_five_percent-> from (-> select length(filename) as l, count(distinct filename) as c, @ccount := @ccount + count(distinct filename) as t, id,filename-> from filenames, (select @ccount := 0) as foo-> group by length(filename)-> ) as cc where cc.t >= (@ccount*0.95) order by cc.t;+--------------------+| ninty_five_percent |+--------------------+| 21 |+--------------------+1 row in set (0.00 sec)

子查询查询结果如下:

[5.6.10-log root@woqu-mysql3 /root root@127.0.0.1:test 15:44:37>select length(filename) as l, count(distinct filename) as c, @ccount := @ccount + count(distinct filename) as t, id, filename-> from filenames, (select @ccount := 0) as foo-> group by length(filename);+----+---+------+----+-----------------------+| l | c | t | id | filename |+----+---+------+----+-----------------------+| 5 | 1 | 1 | 8 | sdfsf || 6 | 1 | 2 | 1 | sdfsdf || 7 | 1 | 3 | 2 | sdfsfsf || 10 | 2 | 5 | 9 | sdsf2sffff || 11 | 1 | 6 | 4 | sdfsdsf32sf || 12 | 1 | 7 | 6 | sdsf2sffffsf || 13 | 1 | 8 | 3 | sdfsdsfds3fsf || 18 | 1 | 9 | 10 | sdsf2sffffdsjjjjjf || 21 | 1 | 10 | 7 | sdsf2sfffffsdfsdfsfsf |+----+---+------+----+-----------------------+9 rows in set (0.00 sec)

按length(filename)排序,其中l表示字符串列filename的长度,c表示filename列中长度为l的行数,t表示filename列中长度小于等于l的行数。@count表示filenames表的总行数。

其中,id和filename列是我特别加进去的,为了更直观的展示该子查询要表达的内容,这样的话,在外面的循环中,我们根据t来排序,找到大于95% * @count的第一个filename列的长度,也就是Dixon所说的95分为数(和中位数对应)。

 

参考:

http://www.jonathanlevin.co.uk/2011/11/get-95-for-your-index-prefix.html

http://tech.it168.com/a2011/0711/1216/000001216087_11.shtml

http://en.wikipedia.org/wiki/Dixon's_Q_test


from:http://www.woqutech.com/?p=1325


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
4S店客户管理小程序-毕业设计,基于微信小程序+SSM+MySql开发,源码+数据库+论文答辩+毕业论文+视频演示 社会的发展和科学技术的进步,互联网技术越来越受欢迎。手机也逐渐受到广大人民群众的喜爱,也逐渐进入了每个用户的使用。手机具有便利性,速度快,效率高,成本低等优点。 因此,构建符合自己要求的操作系统是非常有意义的。 本文从管理员、用户的功能要求出发,4S店客户管理系统中的功能模块主要是实现管理员服务端;首页、个人中心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、系统管理,用户客户端:首页、车展、新闻头条、我的。门店客户端:首页、车展、新闻头条、我的经过认真细致的研究,精心准备和规划,最后测试成功,系统可以正常使用。分析功能调整与4S店客户管理系统实现的实际需求相结合,讨论了微信开发者技术与后台结合java语言和MySQL数据库开发4S店客户管理系统的使用。 关键字:4S店客户管理系统小程序 微信开发者 Java技术 MySQL数据库 软件的功能: 1、开发实现4S店客户管理系统的整个系统程序; 2、管理员服务端;首页、个人中心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、系统管理等。 3、用户客户端:首页、车展、新闻头条、我的 4、门店客户端:首页、车展、新闻头条、我的等相应操作; 5、基础数据管理:实现系统基本信息的添加、修改及删除等操作,并且根据需求进行交流信息的查看及回复相应操作。
现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本微信小程序医院挂号预约系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍的效果。此微信小程序医院挂号预约系统利用当下成熟完善的SSM框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的MySQL数据库进行程序开发。微信小程序医院挂号预约系统有管理员,用户两个角色。管理员功能有个人中心,用户管理,医生信息管理,医院信息管理,科室信息管理,预约信息管理,预约取消管理,留言板,系统管理。微信小程序用户可以注册登录,查看医院信息,查看医生信息,查看公告资讯,在科室信息里面进行预约,也可以取消预约。微信小程序医院挂号预约系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值