索引失效
1.模糊查询
2.使用函数和计算:
3.不匹配的数据类型:
4.使用OR条件的不同索引列:
5.复合索引的最左前缀原则:
6.索引列在条件中使用负向查询:
如NOT IN、NOT EXISTS、NOT LIKE等负向查询条件可能会导致索引失效。
7.索引列在条件中使用NULL:
当索引列中包含NULL值,并且在查询条件中使用IS NULL或IS NOT NULL时,索引可能会失效。
mysql优化
1.根据三范式建表,为了查询方便适当冗余。
2.索引优化 wehere order列创建索引。
3.尽量使用覆盖索引,SELECT语句中尽量不要使用
覆盖索引是一种非常强大的工具,能大大提高查询性能,只需要读取索引而不需要读取数据
4.order by、group by语句要尽量使用到索引。
5.索引长度尽量短,短索引可以节省索引空间,使查找的速度得到提升。
6.JOIN两张表的关联字段最好都建立索引,而且最好字段类型是一样的。
7.WHERE条件中尽量不要使用not in语句(建议使用not exists)
8.合理利用慢查询日志、explain执行计划查询。
9.LIMIT优化如果预计SELECT语句的查询结果是一条,最好使用 LIMIT 1,可以停止全表扫描。
10.小表驱动大表,建议使用left join时,以小表关联大表
11.避免全表扫描,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
InnoDB 支持事务和行级锁定 *.frm 表定义文件 *.ibd 数据文件和索引文件
MyISAM 高速引擎,拥有较高的插入,查询速度,但不支持事务
Memory 内存存储引擎,拥有极高的插入,更新和查询效率,只在内存上保存数据
Falcon
Archive
CSV
show engines; -- 查看存储引擎
InnoDB的主要的磁盘文件主要分为三 大块:一是系统表空间,二是用户表空间,三是redo日志文件和归档文件
数据结构
二叉树 ->平衡二叉树 -> b树多路平衡查找树 -> b+树
B树:非叶子节点和叶子节点都会存储数据。
B+树:只有叶子节点才会存储数据,非叶子节点至存储键值。叶子节点之间使用双向指针连接,每个节点都会记住头尾的指针,方便修改,新增,删除;
最底层的叶子节点形成了一个双向有序链表
聚簇索引
辅助索引
主键索引
组合索引
覆盖索引
直接在辅助索引树上全部获取,也就是说索引树已经“覆盖”了我们的查询需
求,这时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)
INNER JOIN返回两个表中都有匹配的行。
如果左表中的行在右表中没有匹配,或者右表中的行在左表中没有匹配,这些行不会出现在结果集中。
它是默认的JOIN类型,如果没有指定,则通常执行INNER JOIN。
LEFT JOIN返回左表中的所有行,即使右表中没有匹配。
如果左表中的行在右表中没有匹配,那么这些行仍然会出现在结果集中,右表的相关列将包含NULL值。
LEFT JOIN可以用来查找左表中有但右表中没有的记录。
RIGHT JOIN返回右表中的所有行,即使左表中没有匹配。
如果右表中的行在左表中没有匹配,那么这些行仍然会出现在结果集中,左表的相关列将包含NULL值。
RIGHT JOIN可以用来查找右表中有但左表中没有的记录。
FULL JOIN返回左表和右表中的所有行。
如果左表中的行在右表中没有匹配,或者右表中的行在左表中没有匹配,这些行仍然会出现在结果集中,不匹配的一侧将包含NULL值。
FULL JOIN可以用来查找两个表中所有的记录,无论它们是否在另一表中找到匹配。