wdx2008
博客园
首页
新随笔
联系
订阅
管理
随笔 - 28 文章 - 14 评论 - 8 trackbacks - 3
<
2008年2月
>
日
一
二
三
四
五
六
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
1
2
3
4
5
6
7
8
昵称:
wdx2008
园龄:
4年9个月
粉丝:
0
关注:
0
搜索
常用链接
我的随笔
我的评论
我的参与
最新评论
我的标签
随笔分类
web.config(1)
常用代码块(1)
随笔档案
2008年3月 (1)
2008年2月 (3)
2008年1月 (2)
2007年12月 (4)
2007年7月 (3)
2007年6月 (15)
最新评论
阅读排行榜
评论排行榜
推荐排行榜
2008年2月3日
教你合理设计数据表,将优化进行到底
字符
varchar
可变字符 和存储的字符字节相等 列:abc123占用6个字节(表现为占用磁盘大小,下同)
nvarchar
可变字符 是实际存储字节的两倍 例:abc123占用12个字节 该字符使用
Unicode
编码支持多国语言
char
固定字符 实际表现例:指定列的长度为10 将abc123填充进去后面将出现4个空格。
整数
bigint 占用8个字节
从 -2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 的整型数据(所有数字)。
int
从 -2^31 (-2,147,483,648) 到 2^31 - 1 (2,147,483,647) 的整型数据(所有数字)。
smallint 占用4个字节
从 -2^15 (-32,768) 到 2^15 - 1 (32,767) 的整数数据。
tinyint 占用一个字节
从 0 到 255 的整数数据。
总结:
1.如果网站只是中文,不涉及多国语言的建议使用varchar,使用nvarchar将浪费空间,影响效率。
2.字符长度相对固定的要使用char字段,比如USER_IP。char是定长的, 移动到下一条记录, 只需要做固定长度的指针偏移即可. varchar则必须根据当前记录的长度算出下一个数据指针的偏移.
3.字符为数字的最好使用数字型数据。因为其占用字节更小且排序亦占优势。如手机号码使用Varchar需11位 使用bigint则占用8位。
几个问题:
1. char(n)一定比varchar(n)速度快么?
不一定
计算varchar的偏移是会花去一些cpu时间,但性能瓶颈不在此,在io.
db的io单位是数据页(8192字节)(一页存有多个数据行,数据行不能跨页。当然image,text等例外).
因此一页中行越多,性能越好。
2.使用的数字可能很小,但如果都定义成INT对效率有影响吗?
是的
这个是当然的,首先表现为int和tinyint占用的字节不同,也可理解成占用的磁盘的大小不同,较小的字节可以省去不必要的 内存消耗和相关指针转移。
3.varchar/char不支持多国语言,为什么英文和中文都能正常显示?
这是因为服务器的操作系统和所安装的MSSQL都是中文的。
参考:
http://topic.csdn.net/t/20060324/18/4638303.html
4.其它还有什么方法提高数据库查询效率
合理使用索引
索引是数据库中重要的数据结构,它的根本目的就是为了提高查询效率。现在大多数的数据库产品都采用IBM最先提出的ISAM索引结构。索引的使用要恰到好处,其使用原则如下:
●在经常进行连接,但是没有指定为外键的列上建立索引,而不经常连接的字段则由优化器自动生成索引。
●在频繁进行排序或分组(即进行group by或order by操作)的列上建立索引。
●在条件表达式中经常用到的不同值较多的列上建立检索,在不同值少的列上不要建立索引。比如在雇员表的“性别”列上只有“男”与“女”两个不同值,因此就无必要建立索引。如果建立索引不但不会提高查询效率,反而会严重降低更新速度。
●如果待排序的列有多个,可以在这些列上建立复合索引(compound index)。
●使用系统工具。如Informix数据库有一个tbcheck工具,可以在可疑的索引上进行检查。在一些数据库服务器上,索引可能失效或者因为频繁操作而使得读取效率降低,如果一个使用索引的查询不明不白地慢下来,可以试着用tbcheck工具检查索引的完整性,必要时进行修复。另外,当数据库表更新大量数据后,删除并重建索引可以提高查询速度。
不同编码字节长度测试代码:
System.Text.Encoding.Unicode.GetByteCount(StrTest);
System.Text.Encoding.UTF8.GetByteCount(StrTest);
System.Text.Encoding.GetEncoding("GB2312").GetByteCount(StrTest);
posted @ 2008-02-03 02:19 wdx2008 阅读(95) 评论(0)
编辑