索引模块
为什么要使用索引?
一、快速查询数据。有了索引可以避免全表扫描,提高查询效率
什么样的信息能成为索引?
一、主键、唯一键以及普通键等
索引的数据结构
一、生成索引,建立二叉查找树进行二分查找
二、生成索引,建立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 () 强制走索引
联合索引的最左匹配原则的成因?
索引是建的越多越好吗?
数据量少的表不需要建立索引,建立会造成额外的索引开销。
数据变更需要去维护索引,所以意味着更多的索引更多的维护成本。
意味着更多的索引需要更多的空间。