数据库主键的作用

来源:互联网 发布:淘宝玩具代理 编辑:程序博客网 时间:2024/05/16 01:06

数据库主键的作用

 (2013-02-25 08:41:44)
转载
标签: 

数据库

 

主键

 

快速

 

更新

 

原理

分类: 数据库技术
最近接到一个项目,要求对数据库的数据进行更新。
数据库的表也很简单,结构都是一个的,就是时间+值列表的形式记录测量值的。
数据更新都不是很难,经过计算即可完成。
由于表中有110万多条记录,数据量比较大,
所以数据更新效率太低,更新1440条数据所消耗的时间如下:

【建立主键前】
2013/2/25 8:31:46 Begin...
2013/2/25 8:31:57 199
2013/2/25 8:32:05 399
2013/2/25 8:32:13 599
2013/2/25 8:32:22 799
2013/2/25 8:32:30 999
2013/2/25 8:32:39 1199
2013/2/25 8:32:47 1399
2013/2/25 8:32:49 End.
这里使用的是事务分组方式进行数据更新,200条一组,更新时间花了1分钟多。
开始以为是更新方式有问题,试了多种更新方法,虽然效率有所提高,但是仍然无法接受。
仔细分析了数据库结构发现,原来数据表中没有主键。
主键的作用是:唯一性;提高检索速度;
于是建立了索引,结果同样用开始的方法,结果如下。
【建立主键后】
2013/2/25 8:35:39 Begin...
2013/2/25 8:35:39 199
2013/2/25 8:35:39 399
2013/2/25 8:35:39 599
2013/2/25 8:35:39 799
2013/2/25 8:35:39 999
2013/2/25 8:35:39 1199
2013/2/25 8:35:39 1399
2013/2/25 8:35:39 End.
只用了不到1秒就完成了!

【分析】
为什么建立主键能加快这么多呢?原因如下。
之前更新的时候,更新语句如下:
Updata 日常报表1 Set 电流 = 1.2 where 时间= '2012-5-21'
在更新的时候,会从 日常报表1 表中查询 时间 列,由于花有110万条数据,所以查询指定记录的平均次数是55万次!更新1440条数据,就要查询7.92亿次,所以计算量要1分钟左右,很正常。
在建议主键后,会对时间列进行排序,排序后,采用二分搜索法来查询,这样110万次最坏查询到的次数为Log2(1100,000)=24次,即使全按最坏情况考虑,更新1440条记录大约只需要查询3.5万次,难怪只用了不到1秒。

原因找到了,所以更加确认了索引的重要,同时也知道了索引效率的影响幅度。
另外再补充一句,如果主键已经建立,需要对别的列进行快速更新,那么可以对此列建立索引,同样可以达到快速检索的目的。