目录
存储引擎
存储引擎是mysql中特有的一个术语,其他数据库中没有
是一个表存储/组织数据的方式
不同的存储引擎,表存储数据的方式不同
给表添加 / 指定存储引擎
show create table 表名; //查看完整建表语句
//可以在建表时给表指定存储引擎
例:
create table t_product(
id int primary key,
name varchar(255)
)engine=InnoDB default charset=gbk;
建表时在最后小括号)的右边使用:
ENGINE来指定存储引擎
CHARSET来指定这张表的字符编码方式
结论:mysql默认的存储引擎:InnoDB
mysql默认的字符编码方式:utf8
查看mysql支持的存储引擎
命令:show engines \G
mysql支持九大存储引擎。版本不同支持情况不同。
//select version(); 查看当前数据库的版本
mysql常用的存储引擎
MyISAM存储引擎
它管理的表具有以下特征:
使用三个文件表示每个表:
格式文件 — 存储表结构的定义(mytable.frm)
数据文件 — 存储表行的内容(mytable.MYD)
索引文件 — 存储表上索引(mytable.MYI):索引是一本书的目录,缩小扫描范围,提高查询效率的一种机制。
提示一下:
对于一张表来说,只要是主键,或者加有unique约束的字段上会自动创建索引。
MyISAM存储引擎特点:
可被转换为压缩、只读表来节省空间。这是这种存储引擎的优势!
MyISAM不支持事务机制,安全性低。
InnoDB存储引擎
mysql默认的存储引擎,同时也是一个重量级的存储引擎。
InnoDB支持事务,支持数据库崩溃后自动恢复机制。
InnoDB存储引擎最主要的特点是:非常安全。
它管理的表具有下列主要特征:
– 每个 InnoDB 表在数据库目录中以.frm 格式文件表示
– InnoDB 表空间 tablespace 被用于存储表的内容(表空间是一个逻辑名称。表空间存储数据+索引。)
– 提供一组用来记录事务性活动的日志文件
– 用 COMMIT(提交)、SAVEPOINT 及ROLLBACK(回滚)支持事务处理
– 提供全 ACID 兼容
– 在 MySQL 服务器崩溃后提供自动恢复
– 多版本(MVCC)和行级锁定
– 支持外键及引用的完整性,包括级联删除和更新
InnoDB最大的特点就是支持事务:
以保证数据的安全。效率不是很高,并且也不能压缩,不能转换为只读,不能很好的节省存储空间。
MEMORY存储引擎
使用 MEMORY 存储引擎的表,其数据存储在内存中,且行的长度固定,
这两个特点使得 MEMORY 存储引擎非常快。
MEMORY 存储引擎管理的表具有下列特征:
– 在数据库目录内,每个表均以.frm 格式的文件表示。
– 表数据及索引被存储在内存中。(目的就是快,查询快!)
– 表级锁机制。
– 不能包含 TEXT 或 BLOB 字段。
MEMORY 存储引擎以前被称为HEAP 引擎。
MEMORY引擎优点:查询效率是最高的。不需要和硬盘交互。
MEMORY引擎缺点:不安全,关机之后数据消失。因为数据和索引都是在内存当中。
索引(index)
索引是在数据库表的字段上添加的,是为了提高查询效率存在的一种机制。
一张表的一个字段可以添加一个索引,当然,多个字段联合起来也可以添加索引。
索引相当于一本书的目录,是为了缩小扫描范围而存在的一种机制。
MySQL在查询方面主要就是两种方式:
第一种方式:全表扫描
第二种方式:根据索引检索。
在mysql数据库当中索引也是需要排序的,并且这个索引的排序和TreeSet数据结构相同。
TreeSet(TreeMap)底层是一个自平衡的二叉树!
在mysql当中索引是一个B-Tree数据结构。遵循左小右大原则存放。采用中序遍历方式遍历取数据。
在任何数据库当中主键上都会自动添加索引对象,id字段上自动有索引,因为id是PK。
另外在mysql当中,一个字段上如果有unique约束的话,也会自动创建索引对象。
在任何数据库当中,任何一张表的任何一条记录在硬盘存储上都有一个硬盘的物理存储编号。
在mysql当中,索引是一个单独的对象,不同的存储引擎以不同的形式存在,
在MyISAM存储引擎中,索引存储在一个.MYI文件中。
在InnoDB存储引擎中索引存储在一个逻辑名称叫做tablespace的当中。
在MEMORY存储引擎当中索引被存储在内存当中。
不管索引存储在哪里,索引在mysql当中都是一个树的形式存在。(自平衡二叉树:B-Tree)
什么时候需要给字段添加索引
条件1:数据量庞大(到底有多么庞大算庞大,这个需要测试,因为每一个硬件环境不同)
条件2:该字段经常出现在where的后面,以条件的形式存在,也就是说这个字段总是被扫描。
条件3:该字段很少的DML(insert delete update)操作。(因为DML之后,索引需要重新排序)
建议不要随意添加索引,因为索引也是需要维护的,太多的话反而会降低系统的性能。
建议通过主键查询,建议通过unique约束的字段进行查询,效率是比较高的。
索引的创建和删除语法
创建索引:
mysql> create index emp_ename_index on emp(ename);
//给emp表的ename字段添加索引,起名:emp_ename_index
删除索引:
mysql> drop index emp_ename_index on emp;
//将emp表上的emp_ename_index索引对象删除
数据库的五种索引类型
1、普通索引:普通索引是最基本的索引,它没有任何限制,值可以为空,仅加速查询。
2、唯一索引:索引列中的值必须是唯一的,但是允许为空值。如果是组合索引,则列值的组合必须唯一,创建方法和普通索引类似。
3、全文索引:全文索引主要用来查找文本中的关键字,而不是直接与索引中的值相比较。
//不过切记对于大容量的数据表,生成全文索引是一个非常消耗时间非常消耗硬盘空间的做法。
4、主键索引:在我们给一个字段设置主键的时候,它就会自动创建主键索引,用来确保每一个值都是唯一的。
5、复合索引:两个字段或者更多的字段上添加索引
//注意:唯一性比较弱的字段上添加索引用处不大。
索引是各种数据库进行优化的重要手段,优化的时候优先考虑的因素就是索引