### Mysql查询优化 >- 慢查询:减少不需要的数据、不取出全部列、减少相同数据的查询 > 原因:数据量大 select * (禁止) >- 使用覆盖索引 >- 改变数据库表结构(汇总表) >- 重写复杂查询SQL > > mysql记录全部超过 long query time的sql语句的日志 ### Mysql中的索引:聚族索引、辅助索引,定义索引生产B+树 >- InnoDB引擎,B+树,哈希索引,全文索引 >- 聚集索引、聚族索引:将表的主键构造B+树,存放在叶子节点 >- 如果没有主键,mysql创建rowid(看不见) >- 索引需要定义辅助索引、id索引、主键索引等等 >- 辅助索引会存放主键、但是不包含全部数据 >- 主键索引会包含全部数据 >- 联合索引:多个列组合起来索引,减少B+数的数量 >- ![img_5.png](img_5.png) #### 优化:减少索引数量、联合索引 >-回表:通过辅助索引找到主键、再通过主键再找到其他数据(尽量减少) >- 查询优化器:对比:二级索引+回表,全表扫描主键 ### 索引(Index) 帮助Mysql高效获取数据的数据结构 >- 哈希索引,用HashMap实现索引。缺点:范围查找、排序、组合索引、hash冲突 >- B+树=二叉查找(左右子树的值小于根)-平衡(高度差不超过1)-B树:多叉平衡查找树 >- B+:所有数据放在叶子结点,(非叶子结点保存索引,不保存数据)(链表指向相邻结点),Mysql >- ![img_2.png](img_2.png) >- ![img_3.png](img_3.png) >- B树非叶子结点也存放数据、不用链表相连叶子结点,查询效率低、范围小 >- B* 非叶子结点也存放指针Oracle用 >- ![img_4.png](img_4.png) ### 平衡二叉树调整 >- 平衡因子:左右高度差,通过旋转:改变高度差(左旋、右旋) >- ![img.png](img.png) >- ![img_1.png](img_1.png) ### 慢查询优化 >- 重写复杂的sql查询 >- 把指向sql按时间排序 ### 事务和事务隔离级别 >- 事务:整体的执行单位、事务的特性 >- 事务并发引起的问题:脏读问题(回滚)、不可重复读(修改)、幻读(增加) >- READ UNCOMMITTED :未提交读 READ COMMITTED:提交读 REPETABLE READ :可重复读 >- SERIALIZABLE :可串行化 >- 修改:SET [GLOBAL|SESSION] TRANSACTION ISOLATION LEVEL level; ### 事务的操作 >- 开启,提交,回滚 >- 保存点:高级回滚,SAVEPOINT 保存点名称;ROLLBACK TO [SAVEPOINT] 保存点名称; >- 隐式提交:(不同的SQL语言类型)可以不用commit提交 >- 开启下一个事务,上一个事务提交 ### mysql中的锁 >- 锁定读:for update(X锁、独占锁) in share mode >- 锁释放时间