【数据库】- 一个值只有0和1的字段,到底要不要建索引?

关于数据库索引的所有文章,都会告诉你不要对这种字段建索引。

但这些文章不会告诉你的一个事实是:

如果表里面这个字段的值分布极度不均匀的情况下,而且你需要查询分布较少的记录的话,索引就非常有用了

举个例子,假设表中有一千万条记录,某个状态为0的记录总数大概会有100条,那么你想查询状态为0的记录时,有没有索引影响非常大,而查询状态为1的记录,则索引基本无用。如果两种状态的记录数相差无几的话,索引也基本无用。

所有的关于索引的文章,建议你不要为这种字段建索引的依据,都是以值分布是均匀为前提的。但如果值分布不均匀的时候,这个建议就不一定是正确的了。当我们需要查询的记录恰好是分布较少的记录的时候,值分布越是不均匀,索引就越有价值!

索引的本质就是排序,因为大家都排好了队,所以一样的数据都依次排在一块了。这个时候,就像奥运会开幕式入场的运动员们一样,中国队、美国队、德国队。。。队长都举着自己国家的小牌子,让人远远地就能看到那个瑞典队在什么地方(有索引)。这个时候,你要采访瑞典队,直接跑过去就行了。当散场后你再想去餐厅找瑞典队采访(没有索引),估计就得按个问过去:兄弟,你是不是瑞典队的?等你找到采访对象,还是算了吧,人家都吃完饭走人了(查询超时)。。。

二值的情况下,形象点说,就是你在上海人民广场找人,看你找的是中国人还是外国人。找10个中国人很简单,基本上是逮着一个算一个。但要找10个外国人,就比较费时间了。。。这个时候如果大家都排队,中国人排前面,外国人排后面,你就可以直奔队伍的末尾去喊上10个外国人了。

现在大家明白了这种字段的索引到底要不要建了吧。

转自:https://www.cnblogs.com/xuanbg/p/9473049.html

原文地址:https://www.cnblogs.com/wangwust/p/9480862.html

时间: 2024-10-11 11:12:50

【数据库】- 一个值只有0和1的字段,到底要不要建索引?的相关文章

mysql数据库中某项其中一个值在该项排第几,百分几

SQL 如下: sql 1. SELECT X.USER_ID, X.TOTAL_NO, X.ORDER_NO, X.ORDER_NO / X.TOTAL_NO AS PERCENTAGE_NO FROM (SELECT @rowNum := @rowNum + 1 AS ORDER_NO, @rowCount AS TOTAL_NO, USER_ID FROM T_SD_USER, (SELECT @rowNum := 0 ) b, (SELECT @rowCount := ( SELECT

创建一个接口Shape,其中有抽象方法area,类Circle 、Rectangle实现area方法计算其面积并返回。又有Star实现Shape的area方法,其返回值是0,Star类另有一返回值boolean型方法isStar;在main方法里创建一个Vector,根据随机数的不同向其中加入Shape的不同子类对象(如是1,生成Circle对象;如是2,生成Rectangle对象;如是3,生成S

题目补充: 创建一个接口Shape,其中有抽象方法area,类Circle .Rectangle实现area方法计算其面积并返回. 又有Star实现Shape的area方法,其返回值是0,Star类另有一返回值boolean型方法isStar: 在main方法里创建一个Vector,根据随机数的不同向其中加入Shape的不同子类对象(如是1,生成Circle对象: 如是2,生成Rectangle对象:如是3,生成Star对象).然后将Vector中元素依次取出,判断其是否为Star类.如是返回其

转:快速判断一个32位的字中是否存在值为"0"的byte

http://www.spongeliu.com/421.html p { margin-bottom: 0.25cm; line-height: 120% } a:link { } 首先为什么要做这样的判断呢? 当你要strcpy活着strcmp或者hash一个字符串的时候,传统的方法是每个byte进行比较.以strcpy为例,当一个字符串比较长,我们用32(或者64位)的字长进行copy的话,一次拷贝会拷贝4个byte,能节省很多时间(忽略内存对齐等情况). 但是,使用32位的字长进行拷贝一

数据库的值获取过来转换成Json数组的方法

原文出处:http://www.cnblogs.com/jianglan/archive/2011/08/22/2149834.html .cs文件的主要代码: public class User_List //这个类是对应是Extjs的Grid的field里面的,field有几项就写几项 { public int VoteID = 0; public string VoteName = ""; public DateTime SystemDateTime = DateTime.Par

强制获取序列下一个值/当前值(oracle函数)

推荐 作者:靓仔小伙计 作者:周公 oracle创建序列: 先假设有这么一个表: create table S_Depart ( DepartId INT not null, DepartName NVARCHAR2(40) not null, DepartOrder INT default 0, constraint PK_S_DEPART primary key (DepartId) ); 在Oracle中sequence就是所谓的序列号,每次取的时候它会自动增加,一般用在需要按序列号排序的

当post 的字段很多,post的字段并不完全修改(有的值是前端input的值,有的任保留原来原来数据库的值),

有一种解决方法(ps:from ljq):  把数据库的值先全部遍历出来,然后再对遍历出来值的$key进行一个判断, example: foreach ($results[0] as $key => $val) { $results[0][$key] = isset($_POST[$key]) && !empty($_POST[$key]) ? $_POST[$key] : $val; } 还可以把过多post过来的字段,组成一个新的数组.再进行一些数据处理, 或者,对input里的

Mysql数据库一个小程序实现自动创建分表。

每当跨月的时候也是系统出问题最多的时候,没有表和字段缺失是两个最常见的错误. 为了解决这个问题,研究了一下mysql的 information_schema 表: information_schema这张数据表保存了MySQL服务器所有数据库的信息.如数据库名,数据库的表,表栏的数据类型与访问权限等. 再简单点,这台MySQL服务器上,到底有哪些数据库.各个数据库有哪些表,每张表的字段类型是什么,各个数据库要什么权限才能访问,等等信息都保存在information_schema表里面. OK!事

如何高效的检测一个数组是否包含某一个值

如何检测一个数组(未排序)是否包含一个指定的值?这在Java中是一个非常有用且常见的操作.这还是一个在stackoverflow投票最多的一个问题.在投票最多的答案中,有几种不同的方式来完成这个问题.但是时间复杂度存在很大的差异.下面,我将展示每个方法所花费的时间. 1.检测数组中是否包含某一个值的四种方式 1)使用List public static boolean useList(String[] arr, String targetValue) { return Arrays.asList

JAVA获取oracle中sequences的最后一个值

项目中,用到一个序列作单号,框架用的是ssh,在dao层去拿的时候,运行时报错为dual is not mapped,[select *.nextval nextvalue from dual] 后来检查发现,获取方式不对,于是改成下面这样,就可以正常获取了 //获取seq的最后一个值 public String findSeq(){ try { String sql = "select PATIENT_SEQ.nextval nextvalue from dual"; Integer