数据库的数据库索引对程序员来说是透明的,意味着数据库建立索引之前和之后,你的SQL语句都可以正常运行,索引的运用只是数据库引擎工作时候的优化手段。但是,这不是意味着数据库索引仅仅是数据库设计和运维者的事情,对于一个程序员如果对数据库已有的索引有所了解,还是可以大大优化程序员数据库的查询和修改语句执行效率的,以免你的低效查询语句称为拖累整个系统性能的Black Sheep。
1. MySQL的数据类型1.1 数字类型和时间类型数字类型算是最简单的了,主要差异在于各个类型的取值范围大小**,和对存储空间字节数的需求。数字类型当然是在满足情况的条件下越短越好,一方面MySQL每行有65535字节长度的**,同时更宽的数据类型意味着对CPU、内存、磁盘I/O带来压力。 1.1.1 MySQL支持的定点数字类型和占用字节数分别是
在数据库设计的时候,常常看到这些整形有个前缀长度,其实这对其类型本身的存储长度和精度没有影响,只会关系到某些交互式工具显示出来的字符个数。 1.1.2 MySQL支持的浮点(实数)类型和占用字节数为
计算机的浮点运算都是不精确的,如果要实现精确浮点运算,就需要使用DECIMAL类型。 1.1.3 时间类型常被使用的是DATE、DATETIME和TIMESTAMP类型,其表示的范围为:
TIMESTAMP存储的范围比DATETIME要小,但是空间利用率也最高。MySQL支持的时间精度最高为1s,如果更精确的存储,就必须自己定义存储格式了。 1.2 字符串类型MySQL中的字符串类型比较多也比较的复杂,各个字符串类型的差别不仅仅在存储时候的空间占用,对存取时候字段某位的strip和padding还有差异。
1.2.1 CHAR(M)/VARCHAR(M)长度**参数M表示的是本地字符集的字符个数而不是bytes数目,比如对于UTF8编码,每个本地字符其实际占用的byte长度可能是3或4倍的本地字符长度。比如VARCHAR(255),如果每个本地字符占用两个字节,那么其需要的存储空间最大为255x2 2。
1.2.2 BINARY(M)/VARBINARY(M)BINARY/VARBINARY在操作的时候,参考的是byte streaming而不是charaset streaming,所以其长度**参数M表示的是byte数目,在比较的时候也是直接的数字大小比较(而非本地字符集方式比较)。
1.2.3 BLOB/TEXT分别有TINY/MEDIUM/LONG类型的衍生长度,BLOB是bytes streaming类型的,而TEXT是基于character streaming本地字符集类型的,两者在存取的时候都不会进行padding和strip操作。
1.2.4 字符串各个类型占用的空间长度
根据官方手册,CHAR/BINARY及其衍生的类型的数据是存储在表的行内部(inline)的,而对于BLOB和TEXT类型,每一个字段只占用该行9-12(1~4 8)个字节(用于数据的地址和长度),实际的数据是存储在Row Buffer之外位置的。所以对于经常访问的字符串类型,而长度又不是特别的大,还是建议用VARCHAR(M)的数据类型,性能会比TEXT快不少。 2. MySQL数据库索引数据库索引可以用来快速找到需要的行,否则的话MySQL就需要一行一行的遍历,查询效率自然相当的低。
2.1 索引的类型2.1.1 PRIMARY KEY在InnoDB内部,表数据是优化主键快速查询而排列分布的,其查找速度是最快的(相当于聚簇索引:该索引中键值的逻辑顺序决定了表中相应行的物理顺序)。即使表中没有适合做主键的列,也推荐采用一个自动增长的整数主键(代理键),那么这个表在增加数据的时候是顺序存放的,而且后续在别的表参考该外键查询的时候也会得到优化。本身在设计表的时候,也建议常用的数据额不常用的数据分表存放以增加效率。 2.1.2 INDEX普通索引,对数据没有约束要求,多行记录可以包含相同值。无论对于字符串索引,还是多列组合索引,都以及在查询语句中,都有个最左前缀的原则:
| ||||||||||||||||||||||||||||||||||||||
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|