如何安装织梦做的网站,十大拿货网站,类似 wordpress 建站,广告设计跟平面设计索引和锁#xff0c;这两个主题对我们开发工程师来说#xff0c;非常的重要。。。只有理解了这两个主题#xff0c;我们才能写出高质量的sql语句#xff0c;在之前的博客中#xff0c;我所说的索引都是单列索引。。。当然数据库不可能只认单列索引#xff0c;还有我这篇的… 索引和锁这两个主题对我们开发工程师来说非常的重要。。。只有理解了这两个主题我们才能写出高质量的sql语句在之前的博客中我所说的索引都是单列索引。。。当然数据库不可能只认单列索引还有我这篇的复合索引说到复合索引可能熟悉的人又会说到include那这两个索引到底有什么区别呢? 我也是菜鸟一枚。。。所以下面的也是我的个人见解。。。一从数据页角度看问题1. 做两个表插入两条数据在test1上做复合索引在test2上做include索引如下图
-- 在test1表中插入2条记录
CREATE TABLE test1(ID int,Name CHAR(5),Email CHAR(10))
INSERT INTO test1 VALUES(1,aaaaa,111qq.com)
INSERT INTO test1 VALUES(2,bbbbb,222qq.com)
CREATE INDEX idx_test1 ON dbo.test1(Name,Email)-- 在test2表中插入2条记录
CREATE TABLE test2(ID int,Name CHAR(5),Email CHAR(10))
INSERT INTO test2 VALUES(1,aaaaa,111qq.com)
INSERT INTO test2 VALUES(2,bbbbb,222qq.com)
CREATE INDEX idx_test2 ON dbo.test2(Name) INCLUDE(Email)
2. 然后通过DBCC 命令查看数据页记录1 先来看看test1表中各个槽位的信息
DBCC TRACEON(2588,3604)
DBCC IND(Ctrip,test1,-1)
DBCC PAGE(Ctrip,1,194,1)Slot 0, Offset 0x60, Length 27, DumpStyle BYTERecord Type INDEX_RECORD Record Attributes NULL_BITMAP Record Size 27Memory Dump 0x000000000FB0A0600000000000000000: 16616161 61613131 31407171 2e636f6d †.aaaaa111qq.com
0000000000000010: c0000000 01000000 030000†††††††††††††...........Slot 1, Offset 0x7b, Length 27, DumpStyle BYTERecord Type INDEX_RECORD Record Attributes NULL_BITMAP Record Size 27Memory Dump 0x000000000FB0A07B0000000000000000: 16626262 62623232 32407171 2e636f6d †.bbbbb222qq.com
0000000000000010: c0000000 01000100 030000†††††††††††††...........OFFSET TABLE:Row - Offset
1 (0x1) - 123 (0x7b)
0 (0x0) - 96 (0x60)
2 再来看看test2表中各个槽位信息
DBCC TRACEON(2588,3604)
DBCC IND(Ctrip,test2,-1)
DBCC PAGE(Ctrip,1,207,1)Slot 0, Offset 0x60, Length 27, DumpStyle BYTERecord Type INDEX_RECORD Record Attributes NULL_BITMAP Record Size 27Memory Dump 0x000000000DFCA0600000000000000000: 16616161 6161c400 00000100 00003131 †.aaaaa........11
0000000000000010: 31407171 2e636f6d 030000†††††††††††††1qq.com...Slot 1, Offset 0x7b, Length 27, DumpStyle BYTERecord Type INDEX_RECORD Record Attributes NULL_BITMAP Record Size 27Memory Dump 0x000000000DFCA07B0000000000000000: 16626262 6262c400 00000100 01003232 †.bbbbb........22
0000000000000010: 32407171 2e636f6d 030000†††††††††††††2qq.com...OFFSET TABLE:Row - Offset
1 (0x1) - 123 (0x7b)
0 (0x0) - 96 (0x60)
3 从test1和test2的数据页来看都是有两个slot槽位然后我们把test1和test2的slot0槽位拿出来对比下是不是就知道两者大概有什么区别了。test1のslot0
0000000000000000: 16616161 61613131 31407171 2e636f6d †.aaaaa111qq.com
0000000000000010: c0000000 01000000 030000†††††††††††††...........
test2のslot0
0000000000000000: 16616161 6161c400 00000100 00003131 †.aaaaa........11
0000000000000010: 31407171 2e636f6d 030000†††††††††††††1qq.com...
下面我仔细解剖下两表中的slot内容16 6161616161 3131314071712e636f6d c0000000 0100 0000 0300 0016: 这个是索引记录的系统头数据。6161616161: 转换成十进制就是9797979797,也就是字符的aaaaa。3131314071712e636f6d: 这个我想你也懂也就是111qq.com。c000000010000000: 因为我们是堆表所以这个就是表的RowID转化为十进制就是192:1:0。0300这个表示表中的记录数也就是3条记录。如果你对上面的讲解明白了那我们继续看看test2のslot0如果你仔细的话你会看到在test2中111qq.com是在记录的最后。。。那这说明什么问题呢如果你对记录比较熟悉的话你就知道其实记录中的变长字段值一般都是放在记录的尾部。。。好处就是可以做到“行溢出”。也就是可以超过索引的900长度限制。。。而复合索引却无法做到。。。如果你不信我可以做个例子将name和email的长度设为定长500。而include索引却可以顺利通过。。。。。夜深了不准备继续说了。。。下一篇继续扯下复合索引到底都能带来哪些好处。