2016年3月

高性能索引基础

1:索引的含义

  • 类似书籍的目录

2:索引对性能的影响

  • 大大减少服务器需要扫描的数据量
  • 帮助服务器避免排序和生成临时表
  • 将随机的I/O变顺序I/O
  • 大大提高查询速度,降低写的速度,占用磁盘空间(索引也是一种数据)

3:使用场景

  • 非常小表,不适用
  • 中到大兴表,索引非常有效
  • 特大型的表,建立和使用索引的代价将随之增长,可以使用分区技术来解决

4:索引的类型

  • 普通索引:最基本的索引,没有任何约束限制
  • 唯一索引:与普通索引类似,但是具有唯一性约束
  • 主键索引:特殊的唯一索引,不允许有空值

5:主键和唯一索引的区别

  • 一个表只能有一个主键索引,可以有多个唯一索引
  • 主键索引一定是唯一索引,唯一索引不是主键索引
  • 主键可以与外键构成完整性约束,防止数据不一致

6:组合索引

  • 将多个列组合在一起创建索引,可以覆盖多个列
  • 复合索引,在索引建立语句中同时包含多个字段名,最多16个字段

7:其它索引

  • 外键索引:只有InnoDB类型的表才可以使用外键索引,保证数据一致性,完整性和实现级联操作
  • 全文索引:只能用于MyISAM,并且只能对英文进行全文检索

mysql表引擎

1:inodb优势

默认事物型,最重要最广泛,性能非常优秀
数据存储共享表空间
对主键查询的性能高于其他类型的存储引擎
内部优化较好,读取时自动在内存构建hash索引,插入时自动构建缓存区
通过一些机制和工具支持真正的热备份
支持崩溃后的安全恢复
支持行级锁
支持外键

2:MyISAM:

5.1之前,是默认的存储引擎
拥有全文索引,压缩,空间函数
不支持事务和行级锁,不支持崩溃后的安全恢复
存储在两个文件,myd(数据)和myi(索引)
设计简单,某些场景性能很好)(*查)

mysql数据类型

1:整形

  • TINYINT SMALLINT MEDIUMINT INT BIGINT

属性:unsigned表示无符号的意思,也就是非负数,只用于整型
长度:可以为整数类型指定宽度,对大多数应用是没有意义的,不会限制值的合法范围,只会影响显示字符的个数;如果没有达到这个宽度,会在前面zerofill
FLOAT DOUBLE DECIMAL
DECIMAL可存储比BIGINT还大的整数,可以用于存储精确的小数
FLOAT和DOUBLE类型支持使用标准的浮点进行近似计算(小数点后有取值范围)计算

2:字符串

  • VARCHAR CHAR TEXT BLOB

varchar用于存储可变长度字符串,它比定长类型更节省空间
varchar使用1个或2个额外字节记录字符串的长度,列长度小于255字节,使用1个字节表示,否则用2个,会截取超过设定的长度
char定长,根据定义的长度分配足够的空间,会采用空格填充不够的空间
char适合存储很短的字符串或者所有值都接近同一个长度(密码),也会被截断超过定义的长度
对于经常变更的数据,char比varchar更好,char不容易产生碎片
对于非常短的列,char比varchar在存储空间上更有效率
尽量分配真正需要的长度空间,减少消耗的内存
blob/text少用,会产生临时表,消耗更大的内存

3:枚举

优势可以使用枚举代替常用的字符串类型
把不重复的集合存储成一个预定义的集合
非常紧凑,把列表压缩到一个或两个字节
内部存储的是整数
尽量避免使用数字作为枚举的常量,易混乱
排序按照内部存储的整数进行排序
使表大大减小

4:时间

尽量使用timestamp,比datetime空间效率高
用整数保存时间戳的格式通常不方便处理
如果存储微妙,可以使用bigint