黑马程序员 MySQL数据库入门到精通,从mysql安装到mysql高级、mys

存储引擎
存储引擎:基于表而非基于数据库,存储数据,建立索引,更新/查询等数据技术的实现方式。默认InnoDB
InnoDB:兼顾高可用性和高性能的通用存储引擎,
DML操作支持ACID特性:原子性,一致性,隔离性,持久性,支持行级锁,支持外键
逻辑存储结构:表空间,段,区,页,行
MyISAM:是早期默认存储引擎,
特点:
不支持事务,不支持外键
支持表锁,不支持行键
与InnODB区别:
不支持事务,
支持表锁,不支持行锁
不支持外键
索引基本概念
应用场景:InnoDB:对事物完整性有比较高的要求
B+树索引
Hash索引:哈希冲突,哈希碰撞,引入链表
支持引擎:Memory引擎
B+树:非叶子结点不存放数据,可以存储更多key,且会形成双向链表,便于排序
索引分类:
主键索引:默认自动创建,只能有一个,关键字:primary
唯一索引: 可以有多个
explain:
type:all代表全表扫描
ref:非唯一索引
const:唯一索引
index:对索引进行扫描,遍历索引树
索引使用
索引联系了多列:联合索引:
如果最左边的字段不存在:全部失效
如果不连续:部分失效
不要在索引列进行运算操作,否则运算会失效
字符串字段不加单引号,索引失效
如果仅仅是尾部模糊匹配,索引不会失效,否则会失效。
or连接的条件
用or分隔开的条件,如果or前的条件中的列有索引,而后面的没有索引,那么涉及到的索引都不会被用到
数据分布影响:走索引更慢则不走索引
范围查询:>不走索引,>=不走索引
SQL提示:在sql语句加入一些人为的提示
覆盖索引:尽量使用覆盖索引,不需要回表查询数据。
前缀索引:用于处理较长的字符串或者文本
单列索引和联合索引:设计多个查询条件,一般使用联合索引。联合索引排序会先按照第一个字段排序,再按照第二个字段排序。
SQL优化
insert插入优化:批量插入,手动提交数据,主键顺序插入。
大批量插入数据,使用MySQL数据库提供的 load指令进行插入
主键优化
页分裂:主键顺序插入,乱序插入可能会引发页分裂。
页合并:当页中删除的记录达到某个阈值,InonoDB会开始寻找最靠近的页看看是否可以将两个页合并以优化空间使用。
order by 优化:根据排序字段建立合适的索引,多字段索引,也遵循最左前缀法则
尽量使用覆盖索引
多字段排序,需要注意联合索引创建时的规则
如果不可避免出现filesort.可以适当增大sort_buffer_size(默认256)
count优化:没有很好的优化策略
count(主键):会遍历整张表,把每一行id值加起来,交给服务层直接累加,不需要判断
count(*):不取值,直接累加
count(字段):取值判断,然后再累加
count(1):和上一种性能差不多。
update语句:如果更新字段是索引字段,则会增加行锁,否则会增加表锁,降低并发性能。