mysql数据库支持的数据类型
1.数值类型:MySQL支持所有标准SQL中的数值类型,其中包括严格数值类型(INTEGER、SMALLINT(短整型)、DECIMAL(十进制)和NUMERIC(数值)),以及近似数值类型(FLOAT、REAL(实数)和DOUBLE PRECISION),并在此基础上做了扩展,扩展后增加了TINYINT、MEDIUMINT和BIGINT这3种长度不同的整型,并增加了BIT类型。用来存放位数据,其中INT是INTEGER的同名词,DEC是DECIMAL的同名词、 在整数类型中,按照取值范围和存储方式不同,分为tinyint、smallint、mediumint、int和bigint这5个类型。如果超出类型范围的操作,会发生“out of range”错误提示。为了避免此类问题发生,在选择数据类型时要根据应用的实际情况确定其取值范围,最后根据确定的结果慎重选择数据类型。
对于整数类型,MySQL还支持在类型名称后面的小括号内指定显示宽度,例如int(5)表示数值宽度小于5位的时候在数字前面填满宽度,如果不显示指定宽度则默认是int(11),一般配合zerofill使用,顾名思义,zerofill就是用“0”填充的意思,也就是在数字位不够的空间用字符“0”填满,一下几个例子分别描述了填充前后的区别。
2.字符类型:定长型;CHAR(#), BINARY(#)区别:CHAR不区分字符大小写,而BINARY区分;
VARCHAR(#), VARBINARY:变长型
注:而且在检索的时候CHAR列删除了尾部的空格,而VARCHAR则保留有了这些空格。以上列举了字符常用类型
3.时间类型: 日期:DATE
时间:TIME
日期时间:DATETIME
时间戳:TIMESTAMP
年份:YEAR(2), YEAR(4)
4.ENUM类型:枚举,它的取值范围是在创建表时通过枚举方式显示指定,枚举指定方式:例子:创建 create table t1 (gender enum(‘M‘,‘F‘)); 添加 insert into t1 values(‘M‘),(‘M‘),(‘NULL‘),(‘F‘);
5.SET类型:SET和ENUM差不多相似,也是一个字符串对象,可以包含一次选取多个成员。
查看当前表使用的引擎类型:show table status\G;
mysql存储引擎分类
常见的两种存储引擎:
innoDB:
数据存储于“表空间(table space)"中:
(1) 所有InnoDB表的数据和索引存储于同一个表空间中;
表空间文件:datadir定义的目录中
文件:ibdata1, ibdata2, ...
(2) innodb_file_per_table=ON,意味着每表使用单独的表空间文件;
数据文件(数据和索引,存储于数据库目录): tbl_name.ibd
表结构的定义:在数据库目录,tbl_name.frm
事务型存储引擎,适合对事务要求较高的场景中;但较适用于处理大量短期事务;
基于MVCC(Mutli Version Concurrency Control)支持高并发;支持四个隔离级别,默认级别为REPEATABLE-READ;间隙锁以防止幻读;
使用聚集索引(主键索引);
支持”自适应Hash索引“;
锁粒度:行级锁;间隙锁;
MYISAM:
支持全文索引(FULLTEXT index)、压缩、空间函数(GIS);
不支持事务
锁粒度:表级锁
崩溃无法保证表安全恢复
适用场景:只读或读多写少的场景、较小的表(以保证崩溃后恢复的时间较短);
文件:每个表有三个文件,存储于数据库目录中
tbl_name.frm:表格式定义;
tbl_name.MYD:数据文件;
tbl_name.MYI:索引文件;
特性:
加锁和并发:表级锁;
修复:手动或自动修复、但可能会丢失数据;
索引:非聚集索引;
延迟索引更新;
表压缩;
MySQL的索引:
索引的作用:加速查询操作;
表中数据子集:把表中某个或某些字段的数据提取出来另存为一个特定数据结构组织的数据;
某个字段或某些字段:WHERE子句中用到的字段;
索引类型:B+ TREE,HASH
B+ TREE:顺序存储,每一个叶子结点到根结点的距离相同;左前缀索引,适合于范围类型的数据查询;
适用于B+ TREE索引的查询类型:全键值、键值范围或键前缀;
全值匹配:精确匹配某个值;
匹配最左前缀:只精确起头的部分;
匹配范围值:
精确匹配某一列,范围匹配另一列;
只用访问索引的查询:覆盖索引;
不适用B+ TREE索引:
如查条件不是从最左侧列开始,索引无效;
不能跳过索引中的某列;
如果查询中的某个列是为范围查询,那么其右侧的列都无法再使用索引优化查询;
Hash索引:基于哈希表实现,特别适用于值的精确;
适用场景:
只支持等值比较查询,例如=, IN(), <=>
不用场景:
所有非精确值查询;
索引优点:
降低需要扫描的数据量,减少了IO次数;
可以帮助避免排序操作,避免使用临时表;
帮助将随机IO转为顺序IO;
高性能索引策略:
(1) 在WHERE中独立使用列,尽量其参与运算;
(2) 左前缀索引:索引构建于字段的最左侧的多少个字符,要通过索引选择性来评估
索引选择性:不重复的索引值和数据表的记录总数的比值;
(3) 多列索引:
AND边接的多个查询条件更适合使用多列索引,而非多个单键索引;
(4) 选择合适的索引列次序:选择性最高的放左侧;
本文出自 “snowbamboo” 博客,请务必保留此出处http://snowbamboo.blog.51cto.com/11317386/1902789
原文:http://snowbamboo.blog.51cto.com/11317386/1902789