一、索引的概念
数据库索引
- 是一个排序的列表,存储着索引值和这个值所对应的物理地址,相当于一本书的目录
- 无须对整个表进行扫描,通过物理地址就可以找到所需数据
- 是表中一列或者若干列值排序的方法
- 需要额外的磁盘空间
二、索引的作用
- 数据库利用各种快速定位技术,能够大大加快查询速率
- 当表很大或查询涉及到多个表时,可以成千上万倍地提高查询速度
- 可以降低数据库的IO成本,并且还可以降低数据库的排序成本
- 通过创建唯一性索引保证数据表数据的唯一性
- 可以加快表与表之间的连接
- 在使用分组和排序时,可大大减少分组和排序时间
三、char和varchar的区别
char的长度是不变的,而varchar的长度是可变的
字段b:类型char(10), 值为:abc,存储为:abc
字段d:类型varchar(10), 值为:abc,存储为:abc (abc+7个空格)
超出长度自动截取
字段c:类型char(3), 值为:abcdefg, 存储为:abc(defg自动删除)
字段e:类型varchar(3), 值为:abcdefg, 存储为:abc(defg自动删除)
varchar(10)和char(10),都表示存10个字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放10个
char最多可以存放255个字符,varchar的最大长度为65535个字节,varchar可存放的字符数跟编码有关
字符类型若为gbk,每个字符最多占2个字节,最大长度不能超过32766个字符
字符类型若为utf8,每个字符最多占3个字节,最大长度不能超过21845个字符
注:
UTF-8:一个汉字=3个字节
GBK:一个汉字=2个字节
char和varchar的最大长度限制是mysql规定的
四、索引的分类
普通索引
- 最基本的索引,没有唯一性之类的限制
- 创建普通索引的方式
创建表结构时创建
mysql> create table user(id int(4) NOT NULL,name char(48) NOT NULL,age int(3) NOT NULL,sex varchar(36) NOT NULL,primary key (name),index index_id (id)); #创建表时创建索引
mysql> show index from user; #查看索引
直接创建索引
mysql> create index index_name on user(name);
mysql> show index from user;
修改表结构方式添加索引
mysql> alter table user add index index_age(age);
mysql> show index from user;
唯一性索引
与“普通索引”基本相同
与普通索引的区别是索引列的所有值只能出现一次,即必须唯一
创建唯一索引的方式
直接创建索引
mysql> insert into user(id,name,age,sex) values(1,'liming',18,'男'),(2,'lisi',25,'男'),(3,'lili',20,'女');
mysql> create unique index index_name on user(name);
mysql> show index from user;
修改表结构方式添加索引
mysql> alter table user add unique index_name(name);
mysql> show index from user;
主键索引
是一种特殊的唯一索引,指定为“PRIMARY KEY”
一个表只能有一个主键,不允许有空值
创建主键索引的方式
mysql> create table user(id int(4) NOT NULL,name char(48) NOT NULL,age int(3) NOT NULL,sex varchar(36) NOT NULL,primary key (name);
查看索引
mysql> show index from 表名;
mysql> show keys from 表名;
删除索引
mysql> drop index 索引名 on 表名;
mysql> alter table index 表名 drop index 索引名;
组合索引
可以是单列上创建的索引,也可以是在多列上创建的索引
最左原则,从左往右依次执行
创建组合索引的方式
mysql> create table users(name varchar(9), age int(3),sex tinyint(1),indexx users(name,age,sex));
mysql> show index from users;
全文索引
MySQL从3.23.23版开始支持全文索引和全文检索
索引类型为FULLTEXT
可以在CHAR、VARCHAR或者TEXT类型的列上创建
直接创建索引
mysql> create index index_id on user(id);
mysql> show index from user;
修改表结构方式添加索引
mysql> alter table user add index index_age(age);
mysql> show index from user;
扩展
两张表之间建立内联
mysql> create table user1(id int(10) not null auto_increment,name varchar(64) not null,score int(3) not null,hobby int(2),primary key(id));
mysql> insert into user1(id,name,score,hobby) values(1,'zhaosi',66,2),(2,'liming',77,3),(3,'lihao',88,1);
mysql> select * from user1;
mysql> create table hob(id int(2) primary key,hob_name varchar(40) not null);
mysql> insert into hob(id,hob_name) values(1,'看书'),(2,'聊天'),(3,'美术');
mysql> select * from hob;
mysql> select * from user1 inner join hob on user1.hobby=hob.id;
mysql> select user1.name,hob.hob_name from user1 inner join hob on user1.hobby=hob.id;
mysql> select u.name,h.hob_name from user1 u inner join hob h on u.hobby=h.id;
建立索引试图,相当于Linux中的软链接
mysql> create view view_user as select u.name,h.hob_name from user1 u inner join hob h on u.hobby=h.id; #创建试图,view_user是视图名
mysql> select * from view_user;
mysql> insert into user1(id,name,score,hobby) values(4,'wangwu',69,2); #后续添加的内容会显示在试图中
mysql> select * from view_user;
五、创建索引的原则依据
- 表的主键、外键必须有索引
- 记录数超过300行的表应该有索引
- 经常与其他表进行连接的表,在连接字段上应该建立索引
- 唯一性太差的字段不适合建立索引
- 更新太频繁的字段不适合建立索引
- 经常出现在where子句中的字段,特别是大表的字段,应该建立索引
- 索引应该建立在选择性高的字段上
- 索引应该建立在小字段上,对于大的文本字段甚至超长字段,不要建立索引
六、事务的概念
- 是一种机制、一个操作序列,包含了一组数据库操作命令,并且把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么都执行,要么都不执行
- 是一个不可分隔的工作逻辑单元,在数据库系统上执行并发操作时,事务时最小的控制单元
- 适用于多用户同时操作的数据库系统的场景,如银行、保险公司及证券交易系统等等
- 通过事务的整体性以保证数据的一致性
事务的特点:
原子性
- 事务是一个完整的操作,事务的个元素是不可分的
- 事务中的所有元素必须作为一个整体提交或回滚
- 如果事务中的任何元素失败,则整个事务将失败
一致性
- 当事务完成时,数据必须处于一致状态
- 在事务开始前,数据库中存储的数据处于一致状态
- 在正在进行的事务中,数据可能处于不一致的状态
- 当事务成功完成时,数据必须再次回到已知的一致状态
隔离性
- 对数据进行修改的所有并发事务是彼此隔离的,表明事务必须是独立的,它不应以任何方式依赖于或影响其他事务
- 修改数据的事务可在另一个使用相同数据的事务开始之前访问这些数据,或者在另一个使用相同数据的事务结束之后访问这些数据
持久性
- 指不管系统是否发生故障,事务处理的结果都是永久的
- 一旦事务被提交,事务的效果会被永久地保留在数据库中
事务控制语句
MySQL事务默认是自动提交的,当SQL语句提交时事务便自动提交
事务控制语句
BEGIN或START TRANSACTION
COMMIT
ROLLBACK
SAVEPOINT identifier
RELEASE SAVEPOINT identifier
ROLLBACK TO identifier
SET TRANSACTION
事务的控制方法
事务处理命令控制事务
BEGIN:开始一个事务
COMMIT:提交一个事务
ROLLBACK:回滚一个事务
使用set命令进行控制
set autocommit=0:禁止自动提交
set autocommit=1:开启自动提交
事务的操作
mysql> begin; #开始事务
mysql> insert into userq1(id,name,score,hobby) values(5,'yy',80,2);
mysql> rollback; #回滚
mysql> commit; #提交
七、存储引擎概念介绍
MySQL中的数据用各种不同的技术存储文件中,每一种技术都使用不同的存储机制、索引技巧、锁定水平并最终提供不同的功能和能力,这些不同的技术以及配套的功能在MySQL中称为存储引擎
存储引擎时MySQL将数据存储在文件系统中的存储方式或者存储格式
MySQL常用的存储引擎
MyISAM
InnoDB
MySQL数据库中的组件,负责执行实际的数据I/O操作
MySQL系统中,存储引擎处于文件系统之上,在数据保存到数据文件之前会传输到存储引擎,之后按照各个存储引擎的存储格式进行存储
八、MyISAM的介绍
MyISAM不支持事务,也不支持外键
- 问速度快
- 对事务完整性没有要求
- MyISAM在磁盘上存储成三个文件
.frm文件存储表定义
数据文件的扩展名为.MYD(MYDATA)
索引文件的扩展名是.MYI(MYIndex)
表级锁定形式,数据在更新时锁定整个表
数据库在读写过程中相互阻塞
会在数据写入的过程阻塞用户数据的读取
也会在数据读取的过程中阻塞用户的数据写入
数据单独写入或读取,速度过程较快且占用资源相对少
MyISAM支持的存储格式
- 静态表
- 动态表
- 压缩表
MyISAM适用的生产场景举例
- 公司业务不需要事务的支持
- 单方面读取或写入数据比较多的业务
- MyISAM存储引擎数据读写都比较频繁场景不适合
- 使用读写并发访问相对较低的业务
- 数据修改相对较少的业务
- 对数据业务一致性要求不是非常高的业务
- 服务器硬件资源相对比较差
九、InnoDB的介绍
InnoDB特点介绍
- 支持4个事务隔离级别
- 行级锁定,但是全表扫描仍然会是表级锁定
- 读写阻塞与事务隔离级别相关
- 能非常高效的缓存索引和数据
- 表与主键以簇的方式存储
- 支持分区、表空间、类似Oracle数据库
- 支持外键约束,5.5前不支持全文索引,5.5后支持全文索引
- 对硬件资源要求还是比较高的场合
InnoDB适用生产场景分析
- 业务需要事务的支持
- 行级锁定对高并发有很好的适用能力,但需要确保查询是通过索引来完成
- 业务数据更新较为频繁的场景,如:论坛,微博等
- 业务数据一致性要求较高,如:银行业务
- 硬件设备内存较大,利用InnoDB较好的缓存能力来提高内存利用率,减少磁盘IO的压力
企业选择存储引擎依据
- 需要考虑每个存储引擎提供的核心功能及应用场景
支持的字段和数据类型
- 所有引擎都支持通用的数据类型但不是所有的引擎都支持其它的字段类型,如二进制对象
锁定类型:不同的存储引擎支持不同级别的锁定
- 表锁定
- 行锁定
索引的支持
- 建立索引在搜索和恢复数据库中的数据时能显著提高性能
- 不同的存储引擎提供不同的制作索引的技术
- 有些存储引擎根本不支持索引
事务处理的支持
- 提高在向表中更新和插入信息期间的可靠性
- 可根据企业业务是否要支持事务选择存储引擎
修改存储引擎
方法一:alter table修改
mysql> alter table 库名 engine=MyISAM;
方法二:修改my.cnf配置文件,指定默认存储引擎并重启服务
vim my.cnf
default-storage-engine=InnoDB
方法三:create table创建表时指定存储引擎
mysql> create table engine Test(id int) engine=MyISAM;