关系型数据库 --- 索引

索引模块

为什么要使用索引?

一、快速查询数据。有了索引可以避免全表扫描,提高查询效率

什么样的信息能成为索引?

一、主键、唯一键以及普通键等

索引的数据结构

一、生成索引,建立二叉查找树进行二分查找

二、生成索引,建立B-Tree 结构进行查找

三、生成索引,建立B+-Tree 结构进行查找 (主流!!!)

四、生成索引,建立Hash 结构进行查找。

BetMap等

MySql数据库不支持BetMap 索引

密集索引和稀疏索引的区别?

密集索引文件中的每个搜索码值都对应一个索引值

稀疏索引文件只为索引码的某些值建立索引项

额外补充:

Inno DB

若一个主键被定义,该主键则作为密集索引

若没有主键被定义,则该表的第一个唯一非空索引则作为密集索引

若不满足以上条件,Inno DB内部会生成一个隐藏的主键(密集索引)

非主键索引存储相关键位和其对应的主键值,包含两次查找

衍生出来的问题,以MySQL为例

如何定位并优化慢查询SQL?

一、根据慢日志定位慢查询SQL(以下不是永久生效,永久去配置文件设置)

show variables like '%quer%';

其中

slow_query_log OFF关闭 需要打开 打开方式 set global show_query_log = on;

slow_query_log_file 日志文件的路径

long_query_time 是指如果这个SQL执行超过十秒钟就会被记录到日志文件中去,也就是慢日志。set global long_query_time = 1;

show status like '%slow_queries%';

slow_queries 即慢查询的数量

二、使用explain 工具去分析SQL

用法是 explain 关键字 加在SQL的最前面。

all 代表全表扫描

all index 代表需要优化 

三、修改SQL或者让SQL尽量走索引

force index () 强制走索引

联合索引的最左匹配原则的成因?

索引是建的越多越好吗?

数据量少的表不需要建立索引,建立会造成额外的索引开销。

数据变更需要去维护索引,所以意味着更多的索引更多的维护成本。

意味着更多的索引需要更多的空间。

猜你喜欢

转载自blog.csdn.net/xinbumi/article/details/89600865