MySQL 数据库总结

MySQL 数据库 

MySQL DBMS - MySQL Database Management System。数据库管理系统。

1 结构图

 

2 MySQL 数据库引擎简介

2.1ISAM(Indexed Sequential Access Method)

ISAM 是一个定义明确且历经时间考验的数据表格管理方法,它在设计之时就考虑到数 据库被查询的次数要远大于更新的次数。因此,ISAM 执行读取操作的速度很快,而且不占 用大量的内存和存储资源。ISAM 的两个主要不足之处在于,它不支持事务处理,也不能够 容错。如果你的硬盘崩溃了,那么数据文件就无法恢复了。如果你正在把 ISAM 用在关键任 务应用程序里,那就必须经常备份你所有的实时数据,通过其复制特性,MYSQL 能够支持 这样的备份应用程序。 注意:使用 ISAM 注意点:必须经常备份所有实时数据。

2.2MyISAM

MyISAM 是 MySQL 的 ISAM 扩展格式(MySQL5.5 之前版本的缺省数据库引擎)数据库 引擎。除了提供 ISAM 里所没有的索引和字段管理的大量功能,MyISAM 还使用一种表格锁 定的机制,来优化多个并发的读写操作,其代价是你需要经常运行 OPTIMIZE TABLE 命令, 来恢复被更新机制所浪费的空间。MyISAM 还有一些有用的扩展,例如用来修复数据库文件 的 MyISAMCHK 工具和用来恢复浪费空间的 MyISAMPACK 工具。MYISAM 强调了快速读取操 作,这可能就是为什么 MySQL 受到了 WEB 开发如此青睐的主要原因:在 WEB 开发中你所 进行的大量数据操作都是读取操作。所以,大多数虚拟主机提供商和 INTERNET 平台提供商 只允许使用 MYISAM 格式。MyISAM 格式的一个重要缺陷就是不能在表损坏后恢复数据。 MyISAM 引擎使用注意:必须经常使用 Optimize Table 命令清理空间;必须经常备份所 有实时数据。工具有用来修复数据库文件的 MyISAMCHK 工具和用来恢复浪费空间的 MyISAMPACK 工具。不支持事务。数据越多,写操作效率越低。因为要维护数据和索引信息。 (索引列越多,相对效率月底。) 如果使用该数据库引擎,会生成三个文件: .frm:表结构信息 .MYD:数据文件 .MYI:表的索引信息

2.3InnoDB

InnoDB 数据库引擎都是造就 MySQL 灵活性的技术的直接产品,这项技术就是 MYSQL++ API。在使用 MYSQL 的时候,你所面对的每一个挑战几乎都源于 ISAM 和 MyISAM 数据库引 擎不支持事务处理(transaction process)也不支持外键。尽管要比 ISAM 和 MyISAM 引擎慢 很多,但是 InnoDB 包括了对事务处理和外来键的支持,这两点都是前两个引擎所没有的。 是现在的 MySQL(5.5 以上版本)常用版本默认引擎 MySQL 官方对 InnoDB 是这样解释的:InnoDB 给 MySQL 提供了具有提交、回滚和崩 溃恢复能力的事务安全(ACID 兼容)存储引擎。InnoDB 锁定在行级并且也在 SELECT 语句提 供一个 Oracle 风格一致的非锁定读,这些特色增加了多用户部署的性能。没有在 InnoDB 中 扩大锁定的需要,因为在 InnoDB 中行级锁定适合非常小的空间。InnoDB 也支持 FOREIGN KEY 强制。在 SQL 查询中,你可以自由地将 InnoDB 类型的表与其它 MySQL 的表的类型混合起来,甚至在同一个查询中也可以混合。 InnoDB 是为处理巨大数据量时的最大性能设计,它的 CPU 效率可能是任何其它基于 磁盘的关系数据库引擎所不能匹敌的。 InnoDB 存储引擎被完全与 MySQL 服务器整合,InnoDB 存储引擎为在主内存中缓存数据 和索引而维持它自己的缓冲池。InnoDB 存储它的表&索引在一个表空间中,表空间可以包 含数个文件(或原始磁盘分区)。这与 MyISAM 表不同,比如在 MyISAM 表中每个表被存在 分离的文件中。InnoDB 表可以是任何尺寸,即使在文件尺寸被限制为 2GB 的操作系统上。 在 MySQL5.7 版本中,InnoDB 存储引擎管理的数据文件为两个:分别是 frm,idb 文件。

InnoDB 特点:

  1. 支持事务
  2. 数据多版本读取(InnoDB+MyISAM+ISAM)
  3. 锁定机制的改进
  4. 实现外键

2.3.1 innodb 与 myisam 区别

  1. InnoDB 支持事务,MyISAM 不支持,对于 InnoDB 每一条 SQL 语言都默认封装成事务, 自动提交,这样会影响速度,所以最好把多条 SQL 语言放在 begin transaction 和 commit 之 间,组成一个事务;
  2. InnoDB 支持外键,而 MyISAM 不支持。对一个包含外键的 InnoDB 表转为 MYISAM 会 失败;
  3. InnoDB 是聚集索引,数据文件是和索引绑在一起的,必须要有主键,通过主键索引 效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此, 主键不应该过大,因为主键太大,其他索引也都会很大。而 MyISAM 是非聚集索引,数据文 件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。
  4. InnoDB 不保存表的具体行数,执行 select count(*) from table 时需要全表扫描。而 MyISAM 用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很 快;
  5. Innodb 不支持全文索引,而 MyISAM 支持全文索引,查询效率上 MyISAM 要高;

2.3.2 如何选择

  1. 是否要支持事务,如果要请选择 innodb,如果不需要可以考虑 MyISAM
  2. 如果表中绝大多数都只是读查询,可以考虑 MyISAM,如果既有读写也挺频繁,请使 用 InnoDB。
  3. 系统崩溃后,MyISAM 恢复起来更困难,能否接受;
  4. MySQL5.5 版本开始 Innodb 已经成为 Mysql 的默认引擎(之前是 MyISAM),说明其优势 是有目共睹的,如果你不知道用什么,那就用 InnoDB,至少不会差。

2.4Memory 存储引擎

Memory 存储引擎,通过名字就很容易让人知道,他是一个将数据存储在内存中的存储 引擎。Memory 存储引擎不会将任何数据存放到磁盘上,仅仅存放了一个表结构相关信息 的.frm 文件在磁盘上面。所以一旦 MySQLCrash 或者主机 Crash 之后,Memory 的表就只剩下一个结构了。Memory 表支持索引,并且同时支持 Hash 和 B-Tree 两种格式的索引。由于是 存放在内存中,所以 Memory 都是按照定长的空间来存储数据的,而且不支持 BLOB 和 TEXT 类型的字段。Memory 存储引擎实现页级锁定。

2.5NDBCluster 存储引擎

NDB存储引擎也叫NDBCluster存储引擎,主要用于 MySQLCluster分布式集群环境,Cluster 是 MySQL 从 5.0 版本才开始提供的新功能。

2.6Merge 存储引擎

MERGE 存储引擎,在 MySQL 用户手册中也提到了,也被大家认识为 MRG_MyISAM 引擎。 Why?因为 MERGE 存储引擎可以简单的理解为其功能就是实现了对结构相同的 MyISAM 表, 通过一些特殊的包装对外提供一个单一的访问入口,以达到减小应用的复杂度的目的。要创 建 MERGE 表,不仅仅基表的结构要完全一致,包括字段的顺序,基表的索引也必须完全一 致。BDB 存储引擎 BDB 存储引擎全称为 BerkeleyDB 存储引擎,和 Innodb 一样,也不是 MySQL 自己开发实 现的一个存储引擎,而是由 SleepycatSoftware 所提供,当然,也是开源存储引擎,同样支持 事务安全。

2.7FEDERATED 存储引擎

FEDERATED 存储引擎所实现的功能,和 Oracle 的 DBLINK 基本相似,主要用来提供对远 程 MySQL 服务器上面的数据的访问接口。如果我们使用源码编译来安装 MySQL,那么必须 手工指定启用 FEDERATED 存储引擎才行,因为 MySQL 默认是不起用该存储引擎的。

2.8ARCHIVE 存储引擎

ARCHIVE 存储引擎主要用于通过较小的存储空间来存放过期的很少访问的历史数据。 ARCHIVE 表不支持索引,通过一个.frm 的结构定义文件,一个.ARZ 的数据压缩文件还有一 个.ARM 的 meta 信息文件。由于其所存放的数据的特殊性,ARCHIVE 表不支持删除,修改操 作,仅支持插入和查询操作。锁定机制为行级锁定。

2.9BLACKHOLE 存储引擎

BLACKHOLE 存储引擎是一个非常有意思的存储引擎,功能恰如其名,就是一个“黑洞”。 就像我们 unix 系统下面的“/dev/null”设备一样,不管我们写入任何信息,都是有去无回。

2.10CSV 存储引擎

CSV 存储引擎实际上操作的就是一个标准的 CSV 文件,他不支持索引。起主要用途就是 大家有些时候可能会需要通过数据库中的数据导出成一份报表文件,而 CSV 文件是很多软件 都支持的一种较为标准的格式,所以我们可以通过先在数据库中建立一张 CSV 表,然后将生 成的报表信息插入到该表,即可得到一份 CSV 报表文件了。

 

3 存储引擎管理

3.1查看数据库支持的存储引擎

show engines

3.2查看数据库当前使用的存储引擎 就是默认引擎是什么。

show variables like '%storage_engine%' 也可以在 MySQL 配置文件中查看。 windows - my.ini。 Linux - my.cnf

3.3查看数据库表所用的存储引擎

show create table table_name

3.4创建表指定存储引擎

create table table_name (column_name column_type) engine = engine_name

3.5修改表的存储引擎

alter table table_name engine=engine_name

3.6修改默认的存储引擎

在 MySQL 配置文件中修改下述内容: default-storage-engine=INNODB

MySQL 配置文件:

windows 系 统 - MySQL 安 装目 录 /my.ini (5.7 版 本 my.ini 文 件在 数 据目 录 中。 C:/programdata/MySQL Server 5.7/mysql/)

linux 系统 - /etc/my.cnf

 

4 MySQL 中的索引简介

4.1索引的优点 为什么要创建索引?

这是因为,创建索引可以大大提高系统的查询性能。

  1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
  2. 可以大大加快 数据的检索速度,这也是创建索引的最主要的原因。
  3. 可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
  4. 在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
  5. 通过使用索引,可以在查询的过程中,使用查询优化器,提高系统的性能。

4.2索引的缺点

也许会有人要问:增加索引有如此多的优点,为什么不对表中的每一个列创建一个索 引呢?这种想法固然有其合理性,然而也有其片面性。虽然,索引有许多优点, 但是,为 表中的每一个列都增加索引,是非常不明智的。 这是因为,增加索引也有许多不利的一个 方面:

  1. 创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
  2. 索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物 理空间。如果要建立聚簇索引,那么需要的空间就会更大。
  3. 当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降 低了数据的维护速度。

4.3什么样的字段适合创建索引

索引是建立在数据库表中的某些列的上面。因此,在创建索引的时候,应该仔细考虑 在哪些列上可以创建索引,在哪些列上不能创建索引。 一般来说,应该在具备下述特性的 列上创建索引:

  1. 在经常需要搜索的列上,可以加快搜索的速度;
  2. 在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构;
  3. 在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度;
  4. 在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范 围是连续的;
  5. 在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的 排序,加快排序查询时间;
  6. 在经常使用在 WHERE 子句中的列上面创建索引,加快条件的判断速度。 建立索引,一般按照 select 的 where 条件来建立,比如: select 的条件是 where f1 and f2,那么如果我们在字段 f1 或字段 f2 上建立索引是没有用的,只有在字段 f1 和 f2 上同时 建立索引才有用等。

4.4什么样的字段不适合创建索引

同样,对于有些列不应该创建索引。一般来说,不应该创建索引的这些列具有下述特点:

  1. 对于那些在查询中很少使用或者参考的列不应该创建索引。这是因为,既然这些 列很少使用到,因此有索引或者无索引,并不能提高查询速度。相反,由于增加了索引,反 而降低了系统的维护速度和增大了空间需求。
  2. 对于那些只有很少数据值的列也不应该增加索引。这是因为,由于这些列的取值 很少,例如人事表的性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比例, 即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索速度。
  3. 对于那些定义为 text, image 和 bit 数据类型的列不应该增加索引。这是因为,这 些列的数据量要么相当大,要么取值很少。 第四,当修改性能远远大于检索性能时,不应该创建索引。这是因为,修改性能和检索 性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因此,当修改性能远远大于检索性能时,不应该创建索引。

 

5 MySQL 中的索引种类

5.1B-Tree 索引

B-Tree 索引,顾名思义,就是所有的索引节点都按照 balance tree 的数据结构来存储。 B-tree 结构可以显著减少定位记录时所经历的中间过程,从而加快存取速度。

B-tree 中,每个结点包含:

  1. 本结点所含关键字的个数;
  2. 指向父结点的指针;
  3. 关键字;
  4. 指向子结点的指针; 对于一棵 m 阶 B-tree,每个结点至多可以拥有 m 个子结点。各结点的关键字和可以拥 有的子结点数都有限制,规定 m 阶 B-tree 中,根结点至少有 2 个子结点,除非根结点为叶 子节点,相应的,根结点中关键字的个数为 1~m-1;非根结点至少有[m/2]([],向上取整) 个子结点,相应的,关键字个数为[m/2]-1~m-1。

B-tree 有以下特性:

  1. 关键字集合分布在整棵树中;
  2. 任何一个关键字出现且只出现在一个结点中;
  3. 搜索有可能在非叶子结点结束;
  4. 其搜索性能等价于在关键字全集内做一次二分查找;
  5. 自动层次控制; 由于限制了除根结点以外的非叶子结点,至少含有 M/2 个儿子,确保了结点的至少利用率,

其最低搜索性能为:

其中,M 为设定的非叶子结点最多子树个数,N 为关键字总数; 所以 B-树的性能总是等价于二分查找(与 M 值无关),也就没有 B 树平衡的问题; 由于 M/2 的限制,在插入结点时,如果结点已满,需要将结点分裂为两个各占 M/2 的 结点;删除结点时,需将两个不足 M/2 的兄弟结点合并。

5.2Full-text 索引

Full-text 索引就是我们常说的全文索引,他的存储结构也是 b-tree。主要是为了解决在 我们需要用 like 查询的低效问题。只能解决’xxx%’的 like 查询。如:字段数据为 ABCDE,索 引建立为- A、AB、ABC、ABCD、ABCDE 五个。

 

6 MySQL 中的索引管理

在 MySQL 中,对索引的查看和删除操作是所有索引类型通用的。

6.1普通索引

这是最基本的索引,它没有任何限制 MyIASM 中默认的 BTREE 类型的索引,也是我们大 多数情况下用到的索引。

6.1.1 创建索引

CREATE INDEX index_name ON table_name (column(length)) ALTER TABLE table_name ADD INDEX index_name (column(length)) CREATE TABLE table_name (id int not null auto_increment,title varchar(30) ,PRIMARY KEY(id) , INDEX index_name (title(5)))

6.1.2 查看索引

SHOW INDEX FROM [table_name] SHOW KEYS FROM [table_name] # 只在 MySQL 中可以使用 keys 关键字。

6.1.3 删除索引

DROP INDEX index_name ON talbe_name ALTER TABLE table_name DROP INDEX index_name ALTER TABLE table_name DROP PRIMARY KEY

6.2唯一索引

与普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值(注意和主键不同)。 如果是组合索引,则列值的组合必须唯一,创建方法和普通索引类似

6.2.1 创建索引

CREATE UNIQUE INDEX index_name ON table_name (column(length)) ALTER TABLE table_name ADD UNIQUE index_name (column(length)) CREATE TABLE table_name (id int not null auto_increment,title varchar(30) ,PRIMARY KEY(id) , UNIQUE index_name (title(length)))

6.3全文索引(FULLTEXT)

MySQL 从 3.23.23 版开始支持全文索引和全文检索,FULLTEXT 索引仅可用于 MyISAM 表;他们可以从 CHAR、VARCHAR 或 TEXT 列中作为 CREATE TABLE 语句的一部分被创建,或 是随后使用 ALTER TABLE 或 CREATE INDEX 被添加。 对于较大的数据集,将你的资料输入一个没有 FULLTEXT 索引的表中,然后创建索引, 其速度比把资料输入现有 FULLTEXT 索引的速度更为快。不过切记对于大容量的数据表,生 成全文索引是一个非常消耗时间非常消耗硬盘空间的做法。

6.3.1 创建索引

CREATE FULLTEXT INDEX index_name ON table_name(column(length)) ALTER TABLE table_name ADD FULLTEXT index_name( column) CREATE TABLE table_name (id int not null auto_increment,title varchar(30) ,PRIMARY KEY(id) , FULLTEXT index_name (title))

6.4组合索引(最左前缀)

CREATE TABLE article(id int not null, title varchar(255), time date);

平时用的 SQL 查询语句一般都有比较多的限制条件,所以为了进一步榨取 MySQL 的效 率,就要考虑建立组合索引。

例如上表中针对 title 和 time 建立一个组合索引:ALTER TABLE article ADD INDEX index_title_time (title(50),time(10))。

建立这样的组合索引,其实是相当于分 别建立了下面两组组合索引:

–title,time

–title

为什么没有 time 这样的组合索引呢?这是因为 MySQL 组合索引“最左前缀”的结果。简 单的理解就是只从最左面的开始组合。并不是只要包含这两列的查询都会用到该组合索引,

如下面的几个 SQL 所示:

1,使用到上面的索引 SELECT * FROM article WHERE title='测试' AND time=1234567890; SELECT * FROM article WHERE title='测试';

2,不使用上面的索引 SELECT * FROM article WHERE time=1234567890;

参考:https://segmentfault.com/a/1190000008131735#articleHeader5

6.4.1 创建索引

CREATE INDEX index_name ON table_name (column_list)

 

 

@TODO-PAN

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值