MySQL 索引、事务与存储引擎

一、MySQL 索引介绍

1、索引的概念

  • 是一个排序的列表,存储着索引值和这个值所对应的物理地址
  • 无须对整个表进行扫描,通过物理地址就可以找到所需数据
  • 是表中一列或者若干列值排序的方法
  • 需要额外的磁盘空间

2、索引的作用

  • 数据库利用各种快速定位技术,能够大大加快查询速率
  • 当表很大或查询涉及到多个表时,可以成千上万地提高查询速度
  • 可以降低数据库的IO成本,并且还可以降低数据库的排序成本
  • 通过创建唯一性索引保证数据表数据的唯一性
  • 可以加快表与表之间的连接
  • 在使用分组和排序时,可大大减少分组和排序时间

3、索引的分类

1.普通索引

  • 最基本的索引类型,没有唯一性之类的限制
  • 创建普通索引的方式
CREATE INDEX index_name ON table_name(column(length));

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

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))
);
# 直接创建索引
mysql> create index a1 on kgc.kc65(id);
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

# 修改表结构的方式添加索引 
mysql> alter table kgc.kc65 add index a2 (id);
Query OK, 0 rows affected, 1 warning (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 1

# 创建表结构时,同时创建索引 
mysql> create table kgc.kc1 (id int, name varchar(255),age int,index a1(id));
Query OK, 0 rows affected (0.00 sec)

2.唯一索引

  • 与 “普通索引” 基本相同
  • 与普通索引的区别是索引列的所有值只能出现一次,即必须唯一
  • 创建唯一索引的方式
CREATE UNIQUE INDEX index_name ON table_name(column(length));

ALTER TABLE table_name ADD UNIQUE index_name (column(length));

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))
);
# 创建唯一索引
mysql> create unique index a3 on kgc.kc65(id);
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

# 修改表结构的时候添加唯一索引
mysql> alter table kgc.kc65 add unique a4(id);
Query OK, 0 rows affected, 1 warning (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 1

# 创建表的时候就创建唯一索引
mysql> create table kgc.kc2 (id int, name varchar(255),age int,unique a1(id));
Query OK, 0 rows affected (0.01 sec)

3.主键索引

  • 主键索引是一种特殊的唯一索引,指定为 “PRIMARY KEY”
  • 一个表只能有一个主键,不允许有空值。
  • 一般是在建表的时候同时创建主键索引
CREATE TABLE `kc3` (
    `id` int(11) NOT NULL AUTO_INCREMENT ,
    `title` char(255) NOT NULL ,
    PRIMARY KEY (`id`)
);

4.组合索引(最左前缀)

  • 可以是单列上创建的索引,也可以是在多列上创建的索引
  • 最左原则,从左往右依次执行
  • 创建组合索引的方式
create table user( 
name varchar(9), 
age int(3),
sex tinyint(1),
index user(name, age, sex)
);

# 在 MySQL 中,有一个知识点叫最左原则。下面的 select 语句的 where 条件是依次从左往右执行的。
select * from user where name = '' AND age = '' AND sex = '';

# 若使用的是组合索引 index user(name, age, sex)。
# 在查询中,name、age、sex 的顺序必须如组合索引中一致排序,否则索引将不会生效,例如:
select * from user where age = '' AND name = '' AND sex = '';

5.全文索引(FULLTEXT)

  • MySQL从3.23.23版开始支持全文索引和全文检索
  • 索引类型为FULLTEXT
  • 可以在CHAR、VARCHAR或者TEXT类型的列上创建

4、创建索引的原则依据

  • 表的主键、外键必须有索引
  • 记录数超过300行的表应该有索引
  • 经常与其他表进行连接的表,在连接字段上应该建立索引
  • 唯一性太差的字段不适合建立索引
  • 更新太频繁地字段不适合创建索引
  • 经常出现在where子句中的字段,特别是大表的字段,应该建立索引
  • 索引应该建立在选择性高的字段上
  • 索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引

5、查看索引

  • Table:表的名称。
  • Non_unique:如果索引不能包括重复词,则为 0;如果可以,则为 1。
  • Key_name:索引的名称。
  • Seq_in_index:索引中的列序号,从 1 开始。
  • Column_name:列名称。
  • Collation:列以什么方式存储在索引中。在 MySQL 中,有值‘A’(升序)或 NULL(无分类)。
  • Cardinality:索引中唯一值数目的估计值。通过运行 ANALYZE TABLE 或 myisamchk -a 可以更新。基数根据被存储为整数的统计数据来计数,所以即使对于小型表,该值也没有必要是精确的。基数越大,当进行联合时,MySQL 使用该索引的机会就越大。
  • Sub_part:如果列只是被部分地编入索引,则为被编入索引的字符的数目。如果整列被编入索引,则为NULL。
  • Packed:指示关键字如何被压缩。如果没有被压缩,则为 NULL。
  • Null:如果列含有 NULL,则含有 YES。如果没有,则该列含有 NO。
  • Index_type:用过的索引方法(BTREE, FULLTEXT, HASH, RTREE)。
  • Comment:备注。
show index from kc65;
show keys from kc65;

mysql> show index from kc65;
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| kc65  |          0 | a3       |            1 | id          | A         |           0 |     NULL | NULL   | YES  | BTREE      |         |               |
| kc65  |          0 | a4       |            1 | id          | A         |           0 |     NULL | NULL   | YES  | BTREE      |         |               |
| kc65  |          1 | a1       |            1 | id          | A         |           0 |     NULL | NULL   | YES  | BTREE      |         |               |
| kc65  |          1 | a2       |            1 | id          | A         |           0 |     NULL | NULL   | YES  | BTREE      |         |               |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
4 rows in set (0.00 sec)

6、删除索引

DROP INDEX 索引名 ON 表名;
ALTER TABLE 表名 DROP INDEX 索引名;

mysql> drop index a1 on kgc.kc65;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> alter table kgc.kc65 drop index a2;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

二、MySQL 事务

1、事务的概述

  • 是一种机制、一个操作序列,包含了一组数据库操作命令,并且把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么都执行,要么都不执行
  • 是一个不可分割的工作逻辑单元,在数据库系统上执行并发操作时,事务是最小的控制单元
  • 适用于多用户同时操作的数据库系统的场景,如银行、保险公司及证券交易系统等等
  • 通过事务的整体性以保证数据的一致性

2、事物的ACID特点

  • 原子性(Atomicity)
    • 事务是一个完整的操作,事务的各元素是不可分的
    • 事务中的所有元素必须作为一个整体提交或回滚
    • 如果事务中的任何元素失败,则整个事务将失败
  • 一致性(Consistency)
    • 当事务完成时,数据必须处于一致状态
    • 在事务开始前,数据库中存储的数据处于一致状态
    • 在正在进行的事务中,数据可能处于不一致的状态
  • 隔离性(Isolation)
    • 对数据进行修改的所有并发事务是彼此隔离的,表明事务必须是独立的,它不应以任何方式依赖于或影响其他事务
    • 修改数据的事务可在另一个使用相同数据的事务开始之前访问这些数据,或者
  • 持久性(Durability)
    • 指不管系统是否发生故障,事务处理的结果都是永久的
    • 一旦事务被提交,事务的效果会被永久地保留在数据库中

3、事务控制语句

  • 手动对事务进行控制的方法
    • 事务处理命令控制事务
      • begin:开始一个事务
      • commit:提交一个事务
      • rellback:回滚一个事务
    • 使用set命令进行控制
      • set autocommit=0:禁止自动提交
      • set autocommit=1:开启自动提交
# 禁止自动提交
mysql> set autocommit=0;
Query OK, 0 rows affected (0.00 sec)

# 开启事务
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
# 插入数据
insert into test values(2,"李四",18);
insert into test values(3,"王五",18);


# 提交事务
mysql> commit;
Query OK, 0 rows affected (0.00 sec)


# 插入数据
insert into test values(4,"赵六",18);

# 回滚事务
mysql> rollback;
Query OK, 0 rows affected (0.01 sec)
select * from test;

三、MySQL 存储引擎

1、MySQL 存储引擎介绍

  • MySQL中的数据用各种不同的技术存储在文件中,每一种技术都使用不同的存储机制,索引技巧,锁定水平并最终提供不同的功能和能力,这些不同的技术以及配套的功能在MySQL中称为存储引擎
  • 存储引擎是MySQL将数据存储在文件系统中的存储方式或者存储格式
  • MySQL常用的存储引擎
    • MyISAM
    • InnoDB
  • MySQL数据库中的组件,负责执行实际的数据I/O操作
  • MySQL系统中,存储引擎处于文件系统之上,

2、MyISAM 的介绍

  • MyISAM不支持事务,也不支持外键
  • 访问速度块
  • 对事务完整性没有要求
  • MyISAM在磁盘上存储成三个文件
    • .frm文件存储表定义
    • 数据文件的扩展名为.MYD(MYData)
    • 索引文件的扩展名是.MYI(MYIndex)
  • 表级锁定形式,数据在更新时锁定整个表
  • 数据库在读写过程中相互阻塞
    • 会在数据写入的过程阻塞用户数据的读取
    • 也会在数据读取的过程中阻塞用户的数据写入
  • 数据单独写入或读取,速度过程较快且占用资源相对少
  • MyISAM支持的存储格式
    • 静态表
    • 动态表
    • 压缩表

3、MyISAM 使用的生产场景

  • 公司业务不需要事务的支持
  • 单方面读取或写入数据比较多的业务
  • MyISAM存储引擎数据读写都比较频繁场景不适合
  • 使用读写并发访问相对较低的业务
  • 数据修改相对较少的业务
  • 对数据业务一致性要求不是非常高的业务
  • 服务器硬件资源相对比较差

4、InnoDB 的介绍

  • 支持4个事务隔离级别
  • 行级锁定,但是全表扫描仍然会是表级锁定
  • 读写阻塞与事务隔离级别相关
  • 能非常高效的缓存索引和数据
  • 表与主键以簇的方式存储
  • 支持分区、表空间,类似oracle数据库
  • 支持外键约束,5.5前不支持全文索引,5.5后支持全文索引
  • 对硬件资源要求还是比较高的场合

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值