一、引入问题
原文地址:https://blog.csdn.net/longzhutengyue/article/details/95357467
1.MySQL中慢查询如何优化?
- 建索引,索引是一种优化查询的数据结构
2.索引为什么快
- 没有索引,MySQL不得不首先以第一条记录开始然后读完整个表直到它找出相关的行,表越大,花费时间越多
- 使用B+tree(平衡二叉树)的数据结构,能够快速筛选出需要的记录,避免全表扫描
3.为什么使用B+tree(平衡二叉树)的数据结构能够实现快速筛选
- B+Tree拥有B-Tree的优点,深度浅,数据块大
- 因为只在叶子结点存储数据,从而导致
扫描全表的能力强
,因为叶子结点是顺序的,从而导致排序功能更强
。 - 查询时间相对稳定,原因1:平衡二叉树,解决了查询不会受到结点分布的影响, 原因2:因为数据在叶子结点,导致每次查询的深度是一样的(相对于B-Tree)
二、基本简介
1.索引是应用在 SQL 查询语句的条件(一般作为 WHERE 子句的条件)
2.索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。即在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址,在数据十分庞大的时候,索引可以大大加快查询的速度,这是因为使用索引后可以不用扫描全表来定位某行的数据,而是先通过索引表找到该行数据对应的物理地址然后访问相应的数据
3.索引可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率(提高查询速度,减慢写入速度)
三、MYSQL中索引的语法
1.创建索引
- 在创建表时添加索引
- 在创建表后添加索引
# 在创建表后添加索引
creat index indexname on tablename(column_name)
四、索引的实现原理
- BTree索引:BTree是平衡搜索多叉树,设树的度为2d(d>1),高度为h
2.B+Tree索引:B+Tree是BTree的一个变种,设d为树的度数,h为树的高度
五、关系型数据库简介
1.建表
CREAT TABLE `A` (
`id` int(8) NOT NULL AUTO_INCREMENT COMMENT '主键',
`title` varchar(30) NOT NULL,
`code` varchar(30) text,
`submission_date` DATE DEFAULT NULL COMMENT '下单时间',
PRIMARY KEY ( `id` ),
KEY `type` (`type`) ,
UNIQUE KEY `B` (`user_id`)
)ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='表A';
-
ENGINE=INNODB:将数据库的引擎设置为InnoDB(mysql中两种数据库引擎 :MyISAM 、InnoDB)
-
AUTO_INCREMENT=1:自动增长的起始值为1
-
DEFAULT CHARSET=utf8:设置数据库的默认字符集为utf8
-
NOT NULL: 在操作数据库时如果输入该字段的数据为NULL ,就会报错
-
AUTO_INCREMENT:定义列为自增的属性,一般用于主键,数值会自动加1
-
key:普通索引
-
PRIMARY KEY:主键聚集索引,用于定义列为主键,可以使用多列来定义主键,列间以逗号分隔,必须为NOT NULL
-
UNIQUE KEY:主要是用来防止数据插入的时候重复,一个表只能有一个PRIMARY KEY,但可以有多个UNIQUE KEY, 唯一约束(Unique Key)是指
所有记录中字段的值不能重复出现
解析:KEY B (user_name)
+ 本表(A)的user_name字段与表B的user_name字段建立外键 ;
+ 括号外是建立外键的对应表,括号内是对应字段 ;
+ key未必都是外键;
+ 外键:在一个表中存在的另一个表的主键称此表的外键;
2.事务和锁
事务:就是被绑定在一起作为一个逻辑工作单元的 SQL 语句分组,如果任何一个语句操作失败那么整个操作就被失败,以后操作就会回滚到操作前状态,或者是上有个节点。为了确保要么执行,要么不执行,就可以使用事务。要将有组语句作为事务考虑,就需要通过 ACID 测试,即原子性,一致性,隔离性和持久性。
锁:在所有的 DBMS 中,锁是实现事务的关键,锁可以保证事务的完整性和并发性。与现实生活中锁一样,它可以使某些数据的拥有者,在某段时间内不能使用某些数据或数据结构。当然锁还分级别的。