juner-1050

mysql

索引失效的情况

1. 模糊查询
2. 使用函数和计算
3. 不匹配的数据类型
4. 使用OR条件的不同索引列
5. 复合索引的最左前缀原则
6. 索引列在条件中使用负向查询
7. 如NOT IN、NOT EXISTS、NOT LIKE等负向查询条件可能会导致索引失效
8. 索引列在条件中使用NULL
9. 当索引列中包含NULL值,并且在查询条件中使用IS NULL或IS NOT NULL时,索引可能会失效

mysql优化

 1. 根据三范式建表,为了查询方便适当冗余。
 2. 索引优化 wehere order列创建索引。
 3. 尽量使用覆盖索引,SELECT语句中尽量不要使用
  4. 覆盖索引是一种非常强大的工具,能大大提高查询性能,只需要读取索引而不需要读取数据
  5. order by、group by语句要尽量使用到索引。
  6. 索引长度尽量短,短索引可以节省索引空间,使查找的速度得到提升。
  7. JOIN两张表的关联字段最好都建立索引,而且最好字段类型是一样的。
  8. WHERE条件中尽量不要使用not in语句(建议使用not exists)
  9. 合理利用慢查询日志、explain执行计划查询。
  10. LIMIT优化如果预计SELECT语句的查询结果是一条,最好使用 LIMIT 1,可以停止全表扫描。
  11. 小表驱动大表,建议使用left join时,以小表关联大表
  12. 避免全表扫描,mysql在使用不等于(!=或者<>)的时候无法使用索引导致全表扫描

MVCC

多版本的并发控制,英文全称:Multi Version Concurrency Control,并发访问控制的并发控制技术。


核心理念就是数据快照,不同的事务访问不同版本的数据快照,从而实现不同的事务隔离级别。

MVCC 在mysql 中的实现依赖的是undo log与read view 。InnoDB通过事务的undo日志巧妙地实现了多版本的数据快照。
InnoDB的MVCC是通过在每行记录后面保存两个隐藏的列来实现的。这两个列,一个保存了行的事务 ID,一个保存了行的回滚指针。
根据行为的不同,undo log分为两种: insert undo log 和 update undo log.


好处:读不加锁,读写不冲突

防止幻读:加锁案例案例
开始事务:
事务T1开始,并设置隔离级别为可重复读。
查询账户余额:
事务T1执行一个查询,获取所有账户的余额信息。
为了防止幻读,事务T1在查询时获取一个范围锁(例如,在SQL中使用SELECT ... FOR UPDATE),这样其他事务就无法在这个范围内插入新的记录。
计算新的余额:
事务T1根据某些业务逻辑计算账户的新余额。
更新账户余额:
事务T1更新账户余额。
由于范围锁的存在,其他尝试插入新账户记录的事务(如事务T2)将会被阻塞,直到事务T1完成。
提交事务:
事务T1提交,释放所有的锁。
此时,其他被阻塞的事务(如事务T2)可以继续执行。
通过使用范围锁,我们确保了在事务T1执行期间,不会有新的账户记录被插入,从而控制了幻读的发生。
这种锁机制确保了事务T1在查询和更新操作之间看到的数据是一致的。

需要注意的是,使用锁来控制幻读可能会影响系统的并发性能,因为锁可能会导致其他事务等待。
因此,在设计锁策略时,需要权衡系统的并发性和数据的一致性需求。此外,锁的使用应该遵循最小锁原则,即只锁定必要的资源,以减少对系统并发性能的影响。

存储引擎 主要InnoDB

1. 	InnoDB	支持事务和行级锁定 *.frm 表定义文件 *.ibd 数据文件和索引文件
2. 	MyISAM	高速引擎,拥有较高的插入,查询速度,但不支持事务
3. 	Memory	内存存储引擎,拥有极高的插入,更新和查询效率,只在内存上保存数据
4. 	Falcon
5. 	Archive
6. 	CSV

show engines
InnoDB的主要的磁盘文件主要分为三大块:一是系统表空间,二是用户表空间,三是redo日志文件和归档文件


数据结构

1. 	二叉树 > 平衡二叉树 > b树多路平衡查找树 > b+树
2. 	B树:非叶子节点和叶子节点都会存储数据。
3. 	B+树:只有叶子节点才会存储数据,非叶子节点至存储键值。叶子节点之间使用双向指针连接,每个节点都会记住头尾的指针,方便修改,新增,删除;
4. 	最底层的叶子节点形成了一个双向有序链表

索引类型

  • 聚簇索引
  • 辅助索引
  • 主键索引
  • 组合索引
    覆盖索引
    直接在辅助索引树上全部获取,也就是说索引树已经“覆盖”了我们的查询需
    求,这时MySQL就不会白费力气的回表查询,这中现象就是覆盖索引
    使用覆盖索引可以减少了磁盘IO次数,显著提升查询性能

MySQL锁

粒度

  • 全局锁 flush tables with read lock; unlock tables;
  • 表级锁 lock table aa read(write),bb read(write),其他
  • 行级锁

功能

  • 共享锁 Shared Locks(S锁)
  • 排他锁 Exclusive Locks(X锁)

意向锁 主要作用是为了【全表更新数据】时的性能提升。否则在全表更新数据时,先检索该范是否某些记录上面有行锁。
记录锁(Record Locks) 记录锁, 仅仅锁住索引记录的一行,在单条索引记录上加锁
间隙锁(Gap Locks)
** 临键锁**(Next-Key Locks)

posted on 2024-05-08 18:42  起个名字咋就这么难  阅读(2)  评论(0编辑  收藏  举报

导航