0
点赞
收藏
分享

微信扫一扫

重点知识学习(9.2)--[MySQL数据库索引,浅入数据库引擎]

RJ_Hwang 2022-01-20 阅读 111

文章目录


1.MySql的架构

在这里插入图片描述

自己简单画画,加深一下记忆;

在这里插入图片描述

  • 连接层的主要工作-----> 本地 sock 通信以及基于客户端/服务端工具通信。负责着连接处理、授权认证、安全方案。
  • 第二个服务层;简单的画图可看到:
    • SQL接口处理:SQL 的分析和优化及部分内置函数的执行;
    • 解析器:服务器会解析查询并创建相应的内部解析树;
    • SQL优化:例如:确定查询表的顺序;是否利用素引;然后再生成相应的执行操作;
    • 缓存处理:比如说用的是查询语句;服务器可以查询内部缓存;
  • 存储引擎层:负责数据的存储和提取,服务器会经过API 与存储引擎进行通信,所以说想要啥功能就用啥引擎呗.
  • 数据存储层: 将数据存储在运行于裸设备的文件系统之上,可以与存储引擎交互。

2.MySql的存储引擎(表类型)


存储引擎: 在 MySQL 中用于存储、处理和保护数据的核心服务。 ;用不同的技术实现; 具有不同的配套的相关功能;

在这里插入图片描述

查看我的数据库支持都支持啥引擎?

SHOW ENGINES;

默认用的就是InnoDB引擎;所以之前写建表语句的时候,有时候可能忘记写了指定的引擎也没关系,它就用了默认的;
在这里插入图片描述

查看数据表的引擎

SHOW TABLE STATUS LIKE '数据表的表名';

修改引擎

比如要修改默认引擎

将 mysql.ini 中 default-storage-engine=InnoDB,重启服务. 

创建数据表时指定使用引擎:

建表时指定 CREATE TABLE 表名(...)ENGINE=MYISAM;

创建数据表后修改引擎

建表后修改 ALTER TABLE 表名 ENGINE = INNODB;

主要就是看看MyISamInnodb的区别吧

  • 支持事务,支持外键,表锁,行锁,支持缓存,全文索引,主键自增,但是不存储总行数,适合于处理增,删,改(修改语句较多) 场景.
  • 支持表锁,支持全文索引;不支持事务,外键,行锁,可以存储表的总行数;

在这里插入图片描述



3.数据库索引


比如说,现在在某个表中有很多很多的数据,你还想快点查询到第8000万的那行数据信息;要是select * from '表名' where id = 80000000 ;这还不得等到第二天吗🐶;
这要是实际的项目,好家伙,用户直接卸载跑路了;
那么,考虑考虑用用数据库索引呗.


简单来说: 索引就是 已经排好序的;支持快速查找的;可以帮助数据库高效获取数据的一种数据结构.


基本原理

索引类似于书的目录,借助索引,执行查询时不必扫描整个表就能够快速地找到所需要的数据。


使用索引的优点缺点

  • 提高数据检索的效率,降低数据库的 IO 成本;

  • 通过索引列对数据进行排序,降低数据排序的成本,降低了 CPU 的消耗;

  • 索引要保存主键与索引字段,害得要指向实体表的记录,那么必然 占用磁盘空间
  • 我们对表数据进行更改(增删改)操作时,害得要维护对应的索引信息.

索引创建的原则


可以创建索引的状况---->

  • 主键自动建立唯一索引 ;(这个索引他自己就创建了,你没办法吧)
  • 频繁作为查询条件的字段应该创建索引;(可以理解为热点数据吧,这必须得整个索引)
  • 涉及到外键的话,建议用用索引呗
  • 查询得要排序或者分组字段,也建议用用索引.

  • 数据表的记录特别少的那种,就没必要用索引了.
  • 新增,修改,删除频繁的表,你这要是创建索引,好家伙,维护索引表还不如别创建呢
  • 不是查询条件的列,也别用索引了,不用它还给它创建索引干啥.
  • 数据重复且分布均匀的,[比如说数据表中的性别字段],也没有必要用索引.

索引分类


  • (1)主键索引

上主键索引

ALTER TABLE 表名 add PRIMARY KEY 表名(列名);

删除主键索引

ALTER TABLE 表名 drop PRIMARY KEY

比如咱这个管理员表的主键Id索引
在这里插入图片描述


  • (2)单值索引

创建单值索引

CREATE INDEX 索引名 ON 表名(列名);

删除索引:

DROP INDEX 索引名;
CREATE INDEX t_singlevalue_account ON t_admin(account);

在这里插入图片描述

测试使用
在这里插入图片描述


  • (3)唯一索引

创建唯一索引

CREATE UNIQUE INDEX 

删除索引

DROP INDEX 索引名 ON 表名;

  • (4)组合索引(复合索引)

创建组合索引

CREATE INDEX 索引名 ON 表名(1,2...)

删除组合索引

DROP INDEX 索引名 ON 表名;

那么如果说要写查询条件的话,注意遵守组合索引最左前缀原则; 也就是说你要是想用组合索引里面的列作为查询条件时,必须包含组合索引中的最左列;
比如说,现在给我的这个表里,包含了三个列字段;现在我给A列,B列用了组合索引;暂且称呼A列为最左列字段,B列为最右列字段;

在这个案例中,遵守组合索引最左前缀原则;就是说你想用组合索引;条件里面得有A列;

在这里插入图片描述

组合索引不失效的情况

select * from table where c=’’  and a=’’

select * from table where a=’’  and b=’’

.................

组合索引失效情况;这里条件没包含A列

select * from table where b=’’  and c=’’

  • (5)全文索引

创建全文索引

CREATE FULLTEXT INDEX 索引名 ON 表名(字段名) WITH PARSER ngram;

那么用了全文索引的列,咋给它模糊查询捏

SELECT 结构 FROM 表名 WHERE MATCH(列名) AGAINST(搜索词')

案例,试试吧,就在之前和小伙伴一起写的demo项目中试试;
之前我们那个系统正好有个根据新闻标题关键字搜索新闻的需求,当时我用的是模糊查询呢;

OK,为了方便,我直接写SQL语句试试;

为新闻表的标题列;创建全文索引;

CREATE FULLTEXT INDEX news_keyworld ON news(title) WITH PARSER ngram;

在这里插入图片描述

试试吧

SELECT * FROM news WHERE MATCH(`title`) AGAINST('中文');

在这里插入图片描述


还可以查询你这个表用到了啥索引哦
查看索引:

SHOW INDEX FROM 表名;

试试吧

#查询用了啥索引;
SHOW INDEX FROM news;

在这里插入图片描述


索引的数据结构


  • 数据结构 (五) — [二分搜索树 (Java)]

  • 数据结构(十) —[实现平衡树(AVL Tree)]

  • 学习数据结构笔记(13) — [多路查找树的概念以及原理说明]


咱们这个mysql Innodb引擎默认使用 B+树;

  • 排好序的节点,一个节点可以存储多个数据;由于横向扩展, 树的高度降低.
  • 非叶子节点不存储数据,只存储索引,所以可以存储更多的索引;
  • 数据记录都存放在叶子节点中;(找到了索引,也就找了数据)
  • 所有叶子节点之间都有一个链指针,特适合区间查询;

聚簇索引和非聚簇索引


聚簇索引: 找到了索引,就找到了数据;比如说主键就是聚簇索引

在这里插入图片描述

非聚簇索引 :找到了索引但没有找到数据, 还得根据主键进行回表查询;


注意: MyISAM 引擎采用的是非聚簇式设计,

在这里插入图片描述


举报

相关推荐

0 条评论