-- 考点思维导图
-- 索引模块
为什么要使用索引
索引是通过事先排好序,在查找时应用二分查找等高效算法,一般顺序查找复杂度为o(n),二分查找复杂度为o(log2n)。
例:表中有一百万条数据,需要在其中寻找一条特定id的数据,如果顺序查找,平均每条查找50万条数据。使用二分法,最多不超过20次就能找到,两者效率相差2.5万倍
什么样的信息能成为索引
1.主键、唯一键以及普通键等
索引的数据结构
1.生成索引,建立二叉查找树进行二分查找
2.生成索引,建立B-Tree进行查找
3.生成索引,建立B+-Tree结构进行查找
4.生成索引,建立Hash结构进行查找
O(1), O(n), O(logn), O(nlogn) 的区别
如何定位并优化慢sql
1.根据慢日志定位慢sql
2.使用explain等工具分析sql
3.修改sql或者尽量走索引
show variables like '%quer%';
show status like '%slow_queries%';
set global slow_query_log = on;
set global long_query_time = 1;
select count(id) from school;
explain select t.SchoolName from school t;
type:如果是index/all表示全表扫描,需要优化
extra:using filesort、using temporary表示不能使用索引,效率会受到重大影响,需要优化
联合索引的最左匹配原则
1.最左匹配原则,mysql会一直向右匹配知道遇到范围查询(>、<、between、like)就停止匹配。
锁模块
1.myISAM默认用的表级锁,不支持行级锁
2.InnoDB默认用的是行级锁,也支持表级锁
InnoDB支持事务的同时,也相比myISAM引擎带来了,更大的开销。InnoDB有且仅有一个聚集索引,数据文件是和索引绑在一起的,必须要有主键。通过索引效率很高,但是需要查两次,先查到主键,在通过主键查询到数据。
myISAM是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针,主键索引和辅助索引是分离的,因此myISAM在纯检索系统中,也就是增删改很少的系统中,性能要好于InnoDB。
myISAM适合的场景
1.频繁执行全表count语句
2.对数据增删改的频率不高,查询非常频繁的
3.没有事务
InnoDB适合的场景
1.数据增删改查都相当频繁
2.可靠性要求比较高,要求支持事务
数据库锁的分类
1.按表的粒度划分,可分为表级锁、行级锁、页级锁
2.按锁级别划分,可分为共享锁、排它锁
3.按加锁方式划分,可分为自动锁、显示锁
4.按操作划分,可分为DML锁、DDL锁
5.按使用方式划分,可分为乐观锁、悲观锁
数据库事物的四大特性
1.原子性(atomic)事务包含的所有操作,全部执行或者全部失败回滚
2.一致性(Consistency)多个事务操作应满足完整性
3.隔离性(Isolation)多个事务执行,不应该影响其他事物的执行
4.持久性(Durability)一个事务一旦提交,他对数据库的操作及修改应该永久保存在数据库中
事务的隔离界别
select @@tx_isolation;
Read uncommitted
Read committed
Repeatable read
Serializable
1.更新丢失:mysql所有事务隔离级别在数据库层面上均可避免
2.脏读:read committed事务隔离级别以上可避免
3.不可重复读:repeatable read 事务隔离级别以上可避免
4.幻读:serializable事务隔离级别可避免
语法部分
1.group by:分组统计
2.having
3.统计相关:count、sum、max、min、avg