数据库索引:唯一索引【便捷的无重复插入记录的方法(基于mysql)和索引设计思想小结】

最近的项目中负责server端的东西,涉及到许多数据库方面的内容。

这里就记录下如何对在向数据库插入记录的时候尽量快捷的完成无重复插入。

数据库索引的思想

数据库中的索引最形象的比喻就是相当于书本的目录,大概我们要查找一本书中的某个内容,如果没有目录,只要不觉得蛋疼,够淡定,一页一页往后翻总是可以找到想要的内容。可是这种顺序查找的效率太低了。书都是有目录的,比如面前是一本操作系统的书,我们想找关于页的换入换出内容,我们只要先在目录中找到存储设备管理的一章,然后直接跳到对应的页开始搜索,效率和前一种相比自然优秀很多。

数据库搜索数据也和人类看书一样,如果数据库中的数据是按照一定次序存放,并且有种类似目录的东西可以帮助数据库快速定位目标数据的位置,数据库的工作效率也会大大提升。而这种类似目录的东西就是——数据库索引。数据库索引的实现是基于一种树形结构(B-树)。当数据库面对一个有个10000条记录的表A,并且表A的数据杂乱无章的排列时,我们可以从表A中选取一个列并且做成索引,这时数据库会对10000条数据进行整理,并把他们组织成二叉树的结构(数据再多,只要有了一定的次序和结构,对数据的访问就可以灵活多了)。在这个时候,当我们要数据库从A表中给我们抽出某个数据的时候,数据库就不会傻傻的从第一个开始搜索,而是按照树形结构从树根一层一层的搜索(其实就是一次一次的缩小搜索范围的过程)。这样,树有几层,访问几次就能找到数据。

 索引的具体使用:

数据库索引下面直接说说我要做的功能:去除重复记录的把10000条数据存入一个数据库表中。

一种最直观的想法是每次要插入一个记录R的时候,先做一个select操作,搜一下当前表中有没有这条记录R,如果搜索的结果是空,就用insert操作存入R。可是每次都这样搜索(假设目前表中没有建立索引),数据库只能从第一个开始(像翻没有目录的书一样)一条一条的搜索,然后返回结果,数据量越多,这种操作就越低效。

所以虽然上面的方法可行,但是效率和下面一种方法相差很多倍。

假如A表只有一列C(如果是多列的话可以建立联合唯一索引,思想上是没有太大差别的)。我们可以用命令:

ALTER TABLE A ADD UNIQUE (C);

数据库依照C这一列的数据内容建立一个唯一索引(UNIQUE意思就是建立唯一索引,还有很多其他类型的索引),如果是在建立表的时候就直接指定C是唯一索引可以这样:

CREATE TABLE A(id int(10) not null primary key auto_increment,C varchar(20),UNIQUE (C));

这里就建立了一个表,表中第一列是id,他是自动递增的主键,第二列是长度20的字符串列C,并且C被设置成唯一索引。

然后我们利用下面命令往里插入数据:

INSERT IGNORE INTO A(C) VALUES(XXX);

这里和最一般的INSERT命令相比多了一个关键字是IGNORE,意思是如果当前C和表中某行的C列重复了就不做任何处理。

这样无重复插入数据就完成了。

优势:在插入数据的时候,数据库会搜索要插入的数据在数据库当前表中是否存在。而搜索的方式是按照二叉树进行搜索。而不是简单的顺序搜索,所以这样的处理在数据量较大的时候可以明显感觉到效率很高,


技术相关更多文章猛击:哇啦天堂论坛技术区

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值