MySQL 学习笔记2——存储引擎、索引、事务

MySQL 学习笔记2——存储引擎、索引、事务

存储引擎

定义:一个数据文件的存储机制
学习到的是MyISAM、InnoDB、MEMORY、ARCHIVE等

  • MyISAM
  •  不支持外键
     不支持事务
     支持全文索引
     表锁
     对于一些在线分析处理操作速度快
    
  • InnoDB
  • 支持外键
    支持事务
    不支持全文索引
    行锁 
    
    主要是面向在线事务处理方面的应用,采用聚集索引的方式。没有主键没有唯一键,为每一行生产一个6字节的行id,作为主键。
  • MEMORY
  • varchar类型当作char类型(提高效率)
    不支持大文本字段和图片类型
    
    将数据存放在内存中,如果数据库重启或宕机,表数据就会丢失。非常适合存储一些临时表,默认的是哈希索引,不是B+树索引,varchar()默认是按照char()存储的,可以省内存,提高效率。如果数据中有text、blob类型,MEMORY不处理大字段类型,将转交给MyISAM处理,导致这部分一般在磁盘一般在内存,效率大大降低。
    缺点:内存中存放数据一旦断电,数据会丢失,适用于临时数据内存。
  • ARCHIVE
    只支持INSERT和SELETE操作,使用压缩算法将数据进行压缩后存储,压缩比例一般是1:10,主要是提供插入和压缩功能。适用于日志数据。

索引

索引是一种数据结构不是一个搜索方法
从一个1000w条信息的数据库中找到名字是张三的信息
select *from tbname where name=“张三”;

  1. 顺序遍历
  2. 二分查找(先排序,再查找。查找只要24次但排序要增加复杂性)
  3. B+树(多路树,多路搜索)
  • 索引概念解读(看书)

关于MySQL索引的好处,如果正确合理设计并且使用索引的mysql是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车。对于没有索引的表,单表查询可能几十万数据就是瓶颈,而通常大型网站单日就可能会产生几十万甚至几百万的数据,没有索引查询会变的非常缓慢。其多个数据表都会对经常被查询的字段添加索引
MySQL索引的概念
索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度。在没有索引的情况下,数据库会遍历全部200条数据后选择符合条件的;而有了相应的索引之后,数据库会直接在索引中查找符合条件的选项。如果我们把SQL语句换成“SELECT * FROM article WHERE id=2000000”,那么你是希望数据库按照顺序读取完200万行数据以后给你结果还是直接在索引中定位呢?上面的两个图片鲜明的用时对比已经给出了答案(注:一般数据库默认都会为主键生成索引)。
索引分为聚簇索引和非聚簇索引两种,聚簇索引是按照数据存放的物理位置为顺序的,而非聚簇索引就不一样了;聚簇索引能提高多行检索的速度,而非聚簇索引对于单行的检索很快。

  • 普通索引

这是最基本的索引,它没有任何限制, MyIASM中默认的BTREE类型的索引,也是我们大多数情况下用到的索引。
01 –直接创建索引
02 CREATE INDEX index_name ON table(column(length))
03 –修改表结构的方式添加索引
04 ALTER TABLE table_name ADD INDEX index_name ON (column(length))
05 –创建表的时候同时创建索引
06 CREATE TABLE table (
07 id int(11) NOT NULL AUTO_INCREMENT ,
08 title char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
09 content text CHARACTER SET utf8 COLLATE utf8_general_ci NULL ,
10 time int(10) NULL DEFAULT NULL ,
11 PRIMARY KEY (id),
12 INDEX index_name (title(length))
13 )
14 –删除索引
15 DROP INDEX index_name ON table

  • 唯一索引

与普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值(注意和主键不同)。如果是组合索引,则列值的组合必须唯一,创建方法和普通索引类似。
01 –创建唯一索引
02 CREATE UNIQUE INDEX indexName ON table(column(length))
03 –修改表结构
04 ALTER TABLE table_name ADD UNIQUE indexName ON (column(length))
05 –创建表的时候直接指定
06 CREATE TABLE table (
07 id int(11) NOT NULL AUTO_INCREMENT ,
08 title char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
09 content text CHARACTER SET utf8 COLLATE utf8_general_ci NULL ,
10 time int(10) NULL DEFAULT NULL ,
11 PRIMARY KEY (id),
12 UNIQUE indexName (title(length))
13 );

  • 全文索引

MySQL从3.23.23版开始支持全文索引和全文检索,FULLTEXT索引仅可用于 MyISAM 表;他们可以从CHAR、VARCHAR或TEXT列中作为CREATE TABLE语句的一部分被创建,或是随后使用ALTER TABLE 或CREATE INDEX被添加。////对于较大的数据集,将你的资料输入一个没有FULLTEXT索引的表中,然后创建索引,其速度比把资料输入现有FULLTEXT索引的速度更为快。不过切记对于大容量的数据表,生成全文索引是一个非常消耗时间非常消耗硬盘空间的做法。
01 –创建表的适合添加全文索引
02 CREATE TABLE table (
03 id int(11) NOT NULL AUTO_INCREMENT ,
04 title char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
05 content text CHARACTER SET utf8 COLLATE utf8_general_ci NULL ,
06 time int(10) NULL DEFAULT NULL ,
07 PRIMARY KEY (id),
08 FULLTEXT (content)
09 );
10 –修改表结构添加全文索引
11 ALTER TABLE article ADD FULLTEXT index_content(content)
12 –直接创建索引
13 CREATE FULLTEXT INDEX index_content ON article(content)

  • 组合索引

平时用的SQL查询语句一般都有比较多的限制条件,所以为了进一步榨取MySQL的效率,就要考虑建立组合索引。例如上表中针对title和time建立一个组合索引:ALTER TABLE article ADD INDEX index_titme_time (title(50),time(10))。建立这样的组合索引,其实是相当于分别建立了下面两组组合索引:
–title,time
–title
为什么没有time这样的组合索引呢?这是因为MySQL组合索引“最左前缀”的结果。简单的理解就是只从最左面的开始组合。并不是只要包含这两列的查询都会用到该组合索引,如下面的几个SQL所示:
1 –使用到上面的索引
2 SELECT * FROM article WHREE title=‘测试’ AND time=1234567890;
3 SELECT * FROM article WHREE utitle=‘测试’;
4 –不使用上面的索引
5 SELECT * FROM article WHREE time=1234567890;

MySQL 学习笔记2——存储引擎、索引、事务_第1张图片MySQL 学习笔记2——存储引擎、索引、事务_第2张图片MySQL 学习笔记2——存储引擎、索引、事务_第3张图片
MySQL 学习笔记2——存储引擎、索引、事务_第4张图片

事务

定义:满足ACID四个特性则称为事务。

A 原子性
C 一致性
I 隔离性
D 持久性

你可能感兴趣的:(MySQL 学习笔记2——存储引擎、索引、事务)