MySQL(二)

今天简单来看一下存储引擎和索引

一.存储引擎

1. 查看存储引擎的命令。

(1)查看当前的默认存储引擎命令:show  variables  like  ‘table_type’;

MySQL(二)

(2)查看当前数据库支持的存储引擎

1>show  engines \G;

2>Show  variables  like  ‘have%’;

MySQL(二)

MySQL(二)

2. 各种存储引擎的特点

MyISAM

MySQL的默认存储引擎。不支持事务,也不支持外键,但是对于一些在线分析处理操作速度快。对事务完整性没有要求或者以select,insert为主的应用基本上都可以使用这个引擎来创建表。

每个MyISAM在磁盘上存储成3个文件,分别由frm存储表定义、myd存储数据、myi存储索引

Myisam的表支持3种不同的存储格式分别是:静态(固定长度)表,动态表,压缩表。

静态表:表中的字段都是非变长字段,这样每个记录都是固定长度的,优点存储非常迅速,容易缓存,出现故障容易恢复;缺点是占用的空间通常比动态表多(因为存储时会按照列的宽度定义补足空格)ey:在取数据的时候,默认会把字段后面的空格去掉,如果不注意会把数据本身带的空格也会忽略。

动态表:记录不是固定长度的,这样存储的优点是占用的空间相对较少;缺点:频繁的更新、删除数据容易产生碎片,需要定期执行OPTIMIZE TABLE或者myisamchk  -r命令来改善性能

压缩表:因为每个记录是被单独压缩的,所以只有非常小的访问开支

 

InnoDB

支持事务,主要是面向在线事务处理方面的应用,特点是行锁设计,并支持外键InnoDB采用聚集索引的方式。没有主键,没有唯一键

 

Memory

将数据放在内存中,如果数据库重启或者宕机,表数据就会丢失。非常适合存储一些临时表,默认的是哈希索引,不是B+树索引,varchar()默认是按照char()存储的,浪费内存。

不支持text和BLOB类型。如果数据中有text和BLOB类型,数据库会把这些数字转换到磁盘上。


Archive

只支持INSERT和SELECT操作,使用压缩算法将数据进行压缩后存储,压缩比例一般是1:10,主要提供插入和压缩功能。


二.索引

是数据库中用来提高性能的最常用工具。关于MySQL索引的好处,如果正确合理设计并且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车。对于没有索引的表,单表查询可能几十万数据就是瓶颈,而通常大型网站单日就可能会产生几十万甚至几百万的数据,没有索引查询会变的非常缓慢。其多个数据表都会对经常被查询的字段添加索引

1. MySQL索引的概念

索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度。在没有索引的情况下,数据库会遍历全部200条数据后选择符合条件的;而有了相应的索引之后,数据库会直接在索引中查找符合条件的选项。

索引分为聚簇索引和非聚簇索引两种,聚簇索引是按照数据存放的物理位置为顺序的,而非聚簇索引就不一样了;聚簇索引能提高多行检索的速度,而非聚簇索引对于单行的检索很快。

2. MySQL索引的类型

1)普通索引

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

1>.直接创建索引

CREATE  INDEX  index_name  ON  table(column(length))

2>.修改表结构的方式添加索引

ALTER  TABLE  table_name  ADD  INDEX  index_name  ON (column(length))

3>.创建表的时候同时创建索引

CREATE  TABLE  `table` (

`id`  int(11)  NOT NULL  AUTO_INCREMENT ,

`title`  char(255)  CHARACTER  SET  utf8  COLLATE  utf8_general_ci  NOT NULL ,

`content`  text  CHARACTER  SET  utf8  COLLATE  utf8_general_ci  NULL ,

`time`  int(10)  NULL  DEFAULT NULL ,

PRIMARY  KEY (`id`),

INDEX  index_name (title(length))

);

4>.删除索引

DROP  INDEX  index_name  ON  table

5>.查看索引

Show  index   from  table_name  \G;

 

2)唯一索引

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

1>.创建唯一索引

CREATE  UNIQUE  INDEX  indexName  ON  table(column(length))

2>.修改表结构

ALTER  TABLE  table_name  ADD  UNIQUE  indexName  ON  (column(length))

3>.创建表的时候直接指定

CREATE  TABLE  `table` (

`id`  int(11)  NOT  NULL  AUTO_INCREMENT ,

`title`  char(255)  CHARACTER  SET  utf8  COLLATE  utf8_general_ci  NOT NULL ,

`content`  text  CHARACTER  SET  utf8  COLLATE  utf8_general_ci  NULL ,

`time`  int(10)  NULL  DEFAULT  NULL ,

PRIMARY  KEY (`id`),

UNIQUE  indexName (title(length))

);

 

(3)全文索引

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

1>.创建表的适合添加全文索引

CREATE  TABLE  `table` (

`id`  int(11)  NOT NULL  AUTO_INCREMENT ,

`title`  char(255)  CHARACTER  SET  utf8  COLLATE  utf8_general_ci  NOT NULL ,

`content`  text  CHARACTER  SET  utf8  COLLATE  utf8_general_ci  NULL ,

`time`  int(10)  NULL  DEFAULT  NULL ,

PRIMARY  KEY (`id`),

FULLTEXT  (content)

);

2>.修改表结构添加全文索引

ALTER  TABLE  article  ADD  FULLTEXT  index_content(content)

3>.直接创建索引

CREATE  FULLTEXT  INDEX  index_content  ON  article(content)

 

(4)单列索引、多列索引

多个单列索引与单个多列索引的查询效果不同,因为执行查询时,MySQL只能使用一个索引,会从多个索引中选择一个限制最为严格的索引。

5)组合索引(最左前缀)

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

3.MySQL索引的优化

上面都在说使用索引的好处,但过多的使用索引将会造成滥用。因此索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。

(1)何时使用聚集索引或非聚集索引?

MySQL(二)

(2)索引不会包含有NULL值的列

只要列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的。所以我们在数据库设计时不要让字段的默认值为NULL。