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

Posted 小智RE0

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了重点知识学习(9.2)--[MySQL数据库索引,浅入数据库引擎]相关的知识,希望对你有一定的参考价值。

文章目录


1.mysql的架构

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

  • 连接层的主要工作-----> 本地 sock 通信以及基于客户端/服务端工具通信。负责着连接处理、授权认证、安全方案。

比如数据库这边的连接,就需要IP,端口…信息;

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

比如这个当时在创建数据库之后,生成的文件;
就在mysql安装目录下的data文件夹下;


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


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

专业的人做专业的事,不同的引擎,自然就有自己的妙用;
MyIsam
InnoDB
Memory
Blackhole
CSV
Performance_Schema
Archive
Federated
Mrg_Myisam

基本操作看两个吧;

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

SHOW ENGINES;

默认用的就是InnoDB引擎;所以之前写建表语句的时候,有时候可能忘记写了指定的引擎也没关系,它就用了默认的;

查看数据表的引擎

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

还可查出关于这个数据表的其他信息呢

修改引擎

比如要修改默认引擎

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

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

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

创建数据表后修改引擎

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

主要就是看看MyISamInnodb的区别吧

Innodb引擎

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

MyISam引擎

  • 支持表锁,支持全文索引;不支持事务,外键,行锁,可以存储表的总行数;

这里所说的存储表的总行数;
可以这么看 : 比如我要查询某个表的数据总行数
select count(*) from 表名;
MyISam引擎:可以直接获取到总行数;
Innodb引擎: 需要自己运行统计计算

可以看下这两种引擎生成的文件



3.数据库索引


为啥要用数据库索引内?

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


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

引用一下(实际里面没存二叉树)

  • 以某种方式指向数据,在这些数据结构的基础上实现高级查找算法.
  • 左边是数据表,一共有两列七条记录,最左边的是数据记录的物理地址. 为了加快 Col2 的查找,可以维护一个右边所示的二叉查找树,每个节点分别包含索引键值和一个指向对应数据记录物理地址的指针,这样就可以运用二叉查找在一定的复杂度内获取到相应数据,从而快速的检索出符合条件的记录。

基本原理

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


使用索引的优点缺点

优点

  • 提高数据检索的效率,降低数据库的 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)唯一索引

索引列的值必须唯一,允许为 null

创建唯一索引

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)全文索引

之前不是说了要频繁用的字段可以考虑加个索引;
注意加的索引得分情况哦;
比如咱们经常用的模糊查询,索引别用错了哦;它只能用全文索引
只有字段的数据类型为 char、varchar、text 才可以建全文索引。

创建全文索引

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;


索引的数据结构


可以先了解一下这几种树的结构


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

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

聚簇索引和非聚簇索引


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

例如
现在根据学号只为了查询学号;(验证当前学生是否已经存在);
那么可以直接命中到学号列;

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

例如:
现在要根据学号查询当前学生的学号,姓名等信息;
虽然学号加了索引,但还需要查询姓名,性别等信息,
那么就得先根据学号找到主键,然后通过主键回表查询;


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

毕竟它生成的存储文件都是分成三部分的,不在一块放,怎么一次性查完呢


以上是关于重点知识学习(9.2)--[MySQL数据库索引,浅入数据库引擎]的主要内容,如果未能解决你的问题,请参考以下文章

MySQL索引优化与查询优化(重点:索引失效的11种情况)

MySQL索引&事务

mysql重点--索引

mysql面试题

MySQL的索引与事务存储引擎MyISA和InnoDB(重点理论!!!)

MySQL索引重点小总结