找回密码
 立即注册

QQ登录

只需一步,快速开始

Jack.Cheng
超级版主   /  发表于:2022-7-5 14:41  /   查看:3147  /  回复:1
本帖最后由 Jack.Cheng 于 2022-7-5 14:41 编辑

大家用活字格时候,接触到了内置数据库,你可能知道那个用的是sqlite文件型关系数据库。再者,活字格还能够连接到外联数据库
image.png434907225.png
无论内置还是外联,它们都是关系型数据库。无论互联网应用还是企业级应用,它们存大多数数据都会放到数据库里面,而不是像我们平时记个会议纪要会存到一个文件里面去。说明数据库尤其独到之处,很明显的一点是,数据库的查个东西速度会更快。而数据库之所以快,有个关键原因就是索引功能。这篇帖子希望能够面向平民开发者简要介绍下索引这个数据库功能,专业开发者可以直接略过,相信你们对这个非常清楚。

1、关系型数据库都有哪些
关系型数据库是目前存储业务数据的主流方式,也是历史悠久的一种类型。关系一词可以简单理解为二维表,就是这种有行有列的样子
image.png523399352.png
如果我们继续细分,还能分为
商用RDBMS:以Oracle(甲骨文公司,像MySQL,Java都属于他们家的),SQL Server(巨硬家的),DB2等为代表。商用很好理解,就是你用它做商业用途得掏钱
开源RDBMS: 以MySQL(国内用的非常广泛,互联网企业经常用到),PostgreSQL(学术气息应该最浓厚的数据库了吧)为代表。开源的一般会有开源License,开源不一定意味着免费,虽然大多数情况如此。
桌面RDBMS:以Access(也是巨硬家的,目前在Microsoft office套件里面,活字格不少客户之前就是用这个结合VBA来给客户做交付的)为代表。一般适合大家桌面经常用到的软件使用。
嵌入式RDMBS:以sqlite为代表,适合手机这种设备,当然sqlite用途不仅仅局限于此,这是它官网的说明

                           image.png619051818.png
除了上面列出的这些,世界上还有非常多的数据库产品,你可以在这个网站找到它们并查询排名
https://db-engines.com/en/
2、数据库为什么快
相比于把数据存到txt这种文本文件里面,数据库有自己的存储数据的方式,数据库的索引功能,可以让数据查询提到很高的速度。举个例子,把新华字典的前面拼音检索处和部首偏旁检索处等给删除掉,让你在里面找个字,是不是找起来很慢,因为得一页页一个个去找(逐行扫描)。有了前面检索处,我们可以根据拼音和部首快速找到一个字的页码,然后直接去页码处,就能找到那个字(直接定位)。
你可以把数据库索引理解为新华字典的检索处,它们都是起到提高检索效率的作用。

这张是MySQL数据库的基本架构图
image.png870993041.png
优化器模块主要就是处理索引相关的操作的。

3、索引都有哪些类别

索引在不同数据库里面,不同数据引擎里面的数据结构是不一样的。
按照数据结构分类:B+树索引,hash索引,FULLTEXT索引,R-Tree索引。B+树,hash,R-Tree这些就是索引具体的数据结构。


索引具体还是要存到磁盘里面的,从物理存储角度看:聚簇索引,非聚簇索引。聚簇指的是索引和数据存储在一块儿,数据会存储在索引树的叶子节点上。
image.png554729613.png

如果从逻辑性上来区分索引,可以分为:主键索引、单列索引、多列索引、唯一索引。
关系型数据表都会有一个主键,比如活字格内置表自带的这个字段
image.png249131163.png
主键的索引类型就是主键索引,它非空,具有唯一性,自增1

单列索引指的就是数据表的一个列构成的索引,相对的,多列索引指数据表多个列联合构成的索引。这里也说明索引不是只对应到数据表的一列的。

唯一索引指的是具备唯一性的索引,任何两个记录的索引都不相同,比如GUID就是一种典型的唯一索引。

从我的角度理解,数据结构分类的索引和存储引擎相关,而且要求理解复杂数据结构,物理存储分类的索引有点拗口,逻辑性分类的索引最好理解,因此我一般习惯于使用这个分类。

4、怎么建立索引
建立索引需要用到SQL语句或者可视化管理工具,我们以活字格内置的那个sqlite数据库为例看看用SQL如何创建
我们先创建一个表
  1. CREATE TABLE "COMPANY" (
  2.         "ID"        INTEGER NOT NULL,
  3.         "NAME"        TEXT NOT NULL,
  4.         "AGE"        INTEGER NOT NULL,
  5.         "ADDRESS"        CHAR(50),
  6.         "SALARY"        REAL,
  7.         PRIMARY KEY("ID")
  8. );
复制代码

这是我在DB Browser里面的截图
image.png727363280.png
接下来在salary列创建一个单列索引
  1. CREATE INDEX "salary_index" ON "COMPANY" (
  2.         "SALARY"
  3. );
复制代码
创建好后是这样子
image.png261034850.png

5、怎么知道一次查询过程有没有用到索引
如果你写SQL语句去查数据,怎么知道这次查询用到还是没用到索引呢?毕竟就像前面说的,用到索引可非常快呢
数据库提供了explain功能,通过它你可以看到查询过程可能用到的索引(实际由于优化器的参与,不一定和explain结果一模一样)


我们还是举个例子
sqlite中你可以通过explain query plan来查看是否命中索引
以这个查询语句为例
  1. select * from COMPANY where SALARY =20000;
复制代码
这是EXPLAIN QUERY PLAN后的结果截图,表明命中了索引
image.png311066588.png
每个数据库explain的结果都不太一样,具体您需要根据所用数据库的操作手册来看看。


附录资源
  • SQL语句:https://www.w3school.com.cn/sql/index.asp
  • 数据结构基础:https://www.bilibili.com/video/BV1E4411H73v?spm_id_from=333.337.search-card.all.click
  • 数据库可视化管理工具:
                                          Sqlite常用DB Browser(http://www.sqlitebrowser.org/)
                                       SQL Server用SSMS(https://docs.microsoft.com/zh-cn ... ew=sql-server-ver16)多一些                  
                                       Mysql用Navicat(http://www.navicat.com.cn/)和SQLyog(https://webyog.com/product/sqlyog/)多一些
                                       Java生态中,DataGrip(https://www.jetbrains.com.cn/datagrip/)和IDEA中的Database Tools模块可能更加常用

评分

参与人数 1满意度 +5 收起 理由
+ 5

查看全部评分

1 个回复

倒序浏览
zz848
注册会员   /  发表于:2022-7-8 23:11:21
沙发
HeidiSQL is free software, and has the aim to be easy to learn
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部