MySQL

2021-01-20  本文已影响0人  宋song一

MySQL Online DDL

减低io: 1. 次数 2. 单次的量
show variables like "%innodb%";

  1. 为什么B+树?
    二叉树插入数据高度不可控,影响整体IO次数,影响数据访问效率.
    innoDB默认读取16KB数据
    在单个节点存储尽可能多数据,降低树的高度
  2. 存储引擎
    myISAM数据和索引分开存储
    myISAM和innoDB使用B+树,MEMORY使用hash表
    innoDB支持自适应hash(自动选择)
    使用最多是主键索引和组合索引
  3. 为什么不是hash表?
    1. 需要好的hash算法. 不合适会hash冲突和hash碰撞,会导致数据散列不均匀,会退化成链表
    2. 不支持范围查询.范围查询需要挨个对比,效率太低
    3. 需要大量的内存空间
  4. B+树
    每个节点存储: 1. 键值,即表中记录的主键 2. 指针,存储了节点地址信息 3. 数据,即表记录中除主键外的数据
    叶子节点两两指针相互连接(符合磁盘的预读特性),顺序查询性能更高
    B+树有2个头指针,一个指向头节点,一个指向关键字最小的叶子节点
    2种查找:1.对于主键的范围查找和分页查找 2.从根节点开始的随机查找
    非叶子节点不存储数据,只存储key.叶子节点存储key和数据. 千万级别3-4层
  5. 聚簇索引
    插入数据时,必须将数据与索引列绑定,主键,唯一键或6字节rowid
    innoDB存在聚簇索引和非聚簇索引
  6. 分库分布
    mycat,shardingsphere(推荐),drds(阿里云)
  7. 索引
    InnoDB普通索引的叶子节点存储主键值。
    MyISAM的索引叶子节点存储记录指针


    image.png

索引覆盖场景
场景1:全表count查询优化

image

原表为:

user(PK id, name, sex);

直接:

select count(name) from user;

不能利用索引覆盖。

添加索引:

alter table user add key(name);

就能够利用索引覆盖提效。

场景2:列查询回表优化

select id,name,sex ... where name='shenjian';

这个例子不再赘述,将单列索引(name)升级为联合索引(name, sex),即可避免回表。

场景3:分页查询

select id,name,sex ... order by name limit 500,100;

将单列索引(name)升级为联合索引(name, sex),也可以避免回表。

当表中所有字段都是索引列的时候,无论进行怎样的查询都会用到索引
不需要索引字段加索引
key

SQL调优

表结构,数据量,执行计划

上一篇 下一篇

猜你喜欢

热点阅读