1. 为什么要使用使用索引?
最简单的方式--全表扫描,普遍认为很慢。索引类似于字典,通过索引快速查询数据。
2. 什么样的信息能成为索引?
主键、唯一键以及普通键等。
3. 索引的数据结构?
- 生成索引,建立二叉查找树进行二分查找
- 生成索引,建立B树结构进行查找
- 生成索引,建立B+树结构进行查找
- 生成索引,建立Hash结构进行查找
优化你的索引结构
- 二叉查找树上阵
二分查找 O(logn)
缺点是退化成链表:O(n)
- B 树
从图中可以看出,节点信息包括:关键字和指向孩子的指针
-
根节点至少包括两个孩子
-
树中每个节点最多含有m个孩子(m>=2)
-
除根节点和叶节点外,其他每个节点至少有ceil(m/2)个孩子
-
所有叶子节点都位于同一层
设计这样的原因:尽可能少IO操作
- B+ 树
B+树更适合用来做存储索引:
- B+树的磁盘读写代价更低
- B+树的查询效率更加稳定
- B +树更有利于对数据库的扫描
- 适合范围查询
Hash索引也可以考虑一下
- 遇到大量Hash值相等的情况后性能并不一定就会比B-Tree索引高
BitMap索引是个神器
Oracle使用,锁粒度非常大,不适合高并发系统
4. 密集索引和稀疏索引的区别
- 密集索引文件中的每个搜索码值都对应一个索引值
- 稀疏索引文件只为索引码的某些值建立索引项
.frm
.ibd
.frm
.MYI
.MYD
1. 如何定位慢查询?
具体场景具体分析,只提出大致思路:
- 根据慢日志定位慢查询sql
- 使用explain等工具分析sql
- 修改sql或者尽量让sql走索引
SHOW variables like '%quer%';
slow_query_log
slow_query_log_file
long_query_time
SHOW STATUS like '%slow_queries%'; # 查询慢查询次数
SET GLOBAL slow_query_log = on;
SET GLOBAL long_query_time = 1;
SELECT count(id) from person_info_large;
SELECT name from person_info_large order by name desc;
Explain关键字
Explain SELECT name from person_info_large order by name desc;
网友评论