千家信息网

MYSQL(二)数据库聚集/非聚集索引,索引和锁

发表于:2025-02-07 作者:千家信息网编辑
千家信息网最后更新 2025年02月07日,聚集索引(InnoDB,使用B+Tree作为索引结构)在一个结构中保存了b-tree索引和数据行;按照主键的顺序存储在叶子页上;主键索引:叶节点存储key-value为(主键数据:所有剩余列数据)二级
千家信息网最后更新 2025年02月07日MYSQL(二)数据库聚集/非聚集索引,索引和锁

聚集索引(InnoDB,使用B+Tree作为索引结构)

在一个结构中保存了b-tree索引和数据行;按照主键的顺序存储在叶子页上;

主键索引:叶节点存储key-value为(主键数据:所有剩余列数据

二级索引(非聚簇索引):叶节点存储key-value为(索引列数据:主键数据

非叶节点只存储 索引列

优点:

可以把相关数据保存在一起,如根据用户id聚集电子邮箱信息,只需要读取少数的数据页就能获取某个id用户的全部邮件;

数据访问更快,将索引和数据保存在同一个b-tree中

使用覆盖索引扫描的查询可以直接使用叶节点中的主键值

缺点:

插入速度严重依赖于插入顺序,按照主键的顺序插入是加载数据到innodb表中速度最快的方式;

插入新行可能面临页分裂的问题,页分裂导致表占用更多磁盘空间;

通过二级索引需要两次查找,存储引擎找到二级索引的叶子节点获得对应的主键值,根据这个值去聚簇索引中找到对应的行

主键:

如果表没有什么数据需要被聚集(如上述邮件用户id),那么可以定义一个代理键作为主键,使用auto_increment自增列;


非聚集索引(MyISAM使用B+Tree作为索引结构)

按照数据插入顺序存储在磁盘上,访问数据需要一次系统调用

主键索引/二级索引:叶节点存储(索引列数据:数据在磁盘上的行号)


对比:

InnoDB提供事务支持事务,外键等功能;MyISAM不支持。

InnoDB支持行级锁;MyISAM只支持表级锁

InnoDB要求必须有主键;MyISAM允许没有任何索引和主键的表存在,索引都是保存行的地址。


覆盖索引


一个索引包含(或者说覆盖)所有需要查询的字段的值

覆盖索引要存储索引列的值,只能用b-tree索引做覆盖索引(不能用哈希索引,全文索引等)

优点

1. MyISAM存储引擎在内存中只存储索引,覆盖索引不需要进行系统调用;

2. innodb存储引擎的聚簇索引机制,二级主键如果能覆盖查询,可以避免对主键索引的二次查询;


全文索引

希望通过关键字的匹配来进行查询过滤,而不是通过常规的数值比较,范围过滤操作;

MyISAM的全文索引是一类特殊的B-Tree索引,共有两层,第一层是所有关键字,对于每一个关键字的第二层,包含的是一组相关的"文档指针";

对于文档对象中的所有词语的过滤条件:

1. 停用词列表中的词语都不会被索引

2. 长度大于指定范围和小于指定范围的词语不会被索引

另外,全文索引不会存储关键字具体匹配在哪一列。


1. 自然语言全文索引

根据where子句中的MATCH AGAINST区分是否使用全文索引

Eg.在表file_text的字段title,description上建立fulltext全文索引

Select film_id,title,right(description,25)

Match(title,description) against('factory casualties') as relevance

From file_text where Match(title,description) against('factory casualties');

结果:

Film_id title right(description,25) relevance

831 spirited casualties a car is a baloon factory 8.4692449702

126 casualties encino face a boy in a monastery 5.2615661621

... ...

函数match()将返回关键词的匹配相关度,是一个浮点数。


2. 布尔全文索引

用户可以自定义被搜索词语的相关性;用户可以通过一些前置修饰符定制搜索:
example meaning

Dinosaur 包含dinosaur的行rank值更高

-dinosaur 包含dinosaur的行rank值更低

+dinosaur 行记录必须包含dinosaur

-dinosaur 行记录不能包含dinosaur

Dino* 包含以dino开头的单词的行rank值更高

Eg. Select film_id,title,right(description,25)

From file_text where Match(title,description) against('+factory +casualties' in boolean mood);

结果:

Film_id title right(description,25)

831 spirited casualties a car is a baloon factory

搜索的关键词是不常见的词语时,比LIKE操作要快得多,因为是直接从索引中过滤记录

全文索引的限制:

1. mysql的全文索引只有一种判断相关性的方法:词频。没有其他相关性排序算法,如存储的位置。

2. 只有全文索引全部在内存中时,性能才能非常好

3. 其他的where条件,只能在mysql完成全文搜索返回记录后才能进行

4. 全文索引不能存储列的实际值,不能用作覆盖扫描

5. 除了相关性排序,不能用作其他排序

配置和优化

1. 停用词表

2. 允许最小词长

在搜索的精度和搜索的效率之间找到合适的平衡点。


索引和锁

索引可以让查询锁定更少的行,innodb只有在访问行时才会对其加锁,而索引可以减少innodb访问的行数,从而减少锁的数量;

但是,只有当innodb在存储引擎层能够过滤掉不需要的行时才有效,如果无法过滤,那么在innodb检索到数据并返回给服务器层,mysql才能应用where语句进行过滤,而innodb已经锁住了这些行,直到服务器层过滤完成后释放锁;

如:select actor_id from sakila.actor where actor_id < 5 (范围)and actor_id <> 1 (过滤) for update;

执行explain命令,显示type为range,表示mysql为该查询选择的执行计划是索引范围查询,即在存储引擎层只执行了actor_id < 5的条件,查询结果:2,3,4;而被锁定的数据行:1,2,3,4;

即使使用索引,也可能锁住一些不需要的行,但是不使用索引查找的话mysql会全表扫描并锁住所有的行。



索引 数据 存储 全文 查询 关键 节点 搜索 引擎 用户 范围 词语 关键字 只有 相关性 顺序 支持 条件 磁盘 结构 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 安卓pc桌面软件开发 丽江网络安全相关培训朝阳行业 软件开发后端是做什么的 湖南浩然网络技术有限公司如何 房山区网络技术服务报价 管理服务器安装人工费多少钱 数据库行级锁和表锁 网络安全监测预警通报机制 网络安全领域吧已经被发现 宝鸡市阳光网络技术有限公司直播 网络安全800字 dellt30服务器驱动 移动网络安全法律工商部 软件开发好了怎么找人来试玩 数据库实验二检索查询 软件开发 sow 南阳客户管理软件开发多少钱 为什么要通过源码编译安装数据库 软件开发有年薪百万的吗 临汾中小学网络安全教育观后感 死亡之翼服务器可以拖进垃圾桶吗 网络安全工作问题整改结果 二中网络安全保障方案 使命召唤不同服务器可以一起玩吗 ddc软件开发 长沙三一重工软件开发 2018长沙网络安全会议 网络安全领域吧已经被发现 oracle数据库去重复 樊想网络技术
0