积极答复者
对于数据量很大,插入并发很高的表,大家对聚集索引的选择有何建议?

问题
答案
-
不是很明白楼主要问什么
1是问什么场景下使用聚集索引吗
2使用聚集索引之后,应该使用什么技术来生成全局唯一ID,究竟使用是自增列,GUID,时间戳还是NEWSEQUENTIALID()
该使用哪种全局唯一ID技术来应对不同场景和性能问题
比如pagelatch、索引维护
第一个问题,数据量很大,插入并发很高的表,基本上表都需要加聚集索引
第二个问题,不同的场景有不同的选择,简单的使用自增列,我们公司所有表都使用自增列,这样表分区会简单很多,维护也比较简单
GUID,NEWSEQUENTIALID()基于全局的,比如同一个机器同一个库不同表,同一个机器不同库不同表,不同机器
但是管理和维护比较麻烦,个人觉得
时间戳跟自增id一样
还有取模,可以解决last page latch问题,互联网公司基本都使用这种方式
文章地址:http://www.cnblogs.com/shanksgao/p/3893873.html
取模的弊端是:数据倾斜,不均匀
反正没有同吃的方案,要结合公司实际情况,不同场景选择不同方案
Love SQL
- 已编辑 Steven.桦仔 2015年9月27日 15:56 edit
- 已建议为答案 Nan YuMicrosoft contingent staff, Moderator 2015年10月7日 8:38
- 已标记为答案 Nan YuMicrosoft contingent staff, Moderator 2015年10月8日 5:02
-
Steven 桦仔 的方案应该可以解决pagelatch带来的性能问题,但是索引的维护视乎不太好,由于按照ID进行分区,那么每个分区的数据睡着时间的推移,始终在变化,那么整个表估计需要全部重建索引一次,而不能像按时间分区那样,几乎可以只维护当前分区,以前的分区由于数据几乎不变而无需进行索引维护
这个无所谓,索引维护的开销不是很大,找个合适的时间窗口就行。
不过关键是,你要知道为什么这样做,选择合适的方案。只有很热的数据,有pagelatch压力才需要这样分区。
想不想时已是想,不如不想都不想。
- 已建议为答案 Nan YuMicrosoft contingent staff, Moderator 2015年10月7日 8:39
- 已标记为答案 Nan YuMicrosoft contingent staff, Moderator 2015年10月8日 5:02
全部回复
-
不是很明白楼主要问什么
1是问什么场景下使用聚集索引吗
2使用聚集索引之后,应该使用什么技术来生成全局唯一ID,究竟使用是自增列,GUID,时间戳还是NEWSEQUENTIALID()
该使用哪种全局唯一ID技术来应对不同场景和性能问题
比如pagelatch、索引维护
第一个问题,数据量很大,插入并发很高的表,基本上表都需要加聚集索引
第二个问题,不同的场景有不同的选择,简单的使用自增列,我们公司所有表都使用自增列,这样表分区会简单很多,维护也比较简单
GUID,NEWSEQUENTIALID()基于全局的,比如同一个机器同一个库不同表,同一个机器不同库不同表,不同机器
但是管理和维护比较麻烦,个人觉得
时间戳跟自增id一样
还有取模,可以解决last page latch问题,互联网公司基本都使用这种方式
文章地址:http://www.cnblogs.com/shanksgao/p/3893873.html
取模的弊端是:数据倾斜,不均匀
反正没有同吃的方案,要结合公司实际情况,不同场景选择不同方案
Love SQL
- 已编辑 Steven.桦仔 2015年9月27日 15:56 edit
- 已建议为答案 Nan YuMicrosoft contingent staff, Moderator 2015年10月7日 8:38
- 已标记为答案 Nan YuMicrosoft contingent staff, Moderator 2015年10月8日 5:02
-
1. 顺序 insert, 尽量确保插入顺序与聚集索引顺序一致
2. 分区, 在同一时间上插入的数据,分布到不同的分区上,相当于并发写多个分区, 登录同时插入 1-10 的数据,如果只有一个分区,那么是一个串行操作,但如果是分布在 10 个分区,那么就是并行操作(简单的测试过自增列+按自增id % 10 做分区键的情况, 效率可以提升很多)
3. 不管表是否分区,它始终是在一个数据库里面,也就是鸡蛋始终是在一个篮子里,所以能够分表的就尽是考虑分表,将数据分布到不同的服务器上,配合程序设计,这样不单单是性能可以得到保障,还可以很容易做到横向扩展,当然,这样对程序设计要求俯高
-
Steven 桦仔 的方案应该可以解决pagelatch带来的性能问题,但是索引的维护视乎不太好,由于按照ID进行分区,那么每个分区的数据睡着时间的推移,始终在变化,那么整个表估计需要全部重建索引一次,而不能像按时间分区那样,几乎可以只维护当前分区,以前的分区由于数据几乎不变而无需进行索引维护
这个无所谓,索引维护的开销不是很大,找个合适的时间窗口就行。
不过关键是,你要知道为什么这样做,选择合适的方案。只有很热的数据,有pagelatch压力才需要这样分区。
想不想时已是想,不如不想都不想。
- 已建议为答案 Nan YuMicrosoft contingent staff, Moderator 2015年10月7日 8:39
- 已标记为答案 Nan YuMicrosoft contingent staff, Moderator 2015年10月8日 5:02