Mysql小记(默认InnoDB存储引擎)

186 阅读1分钟

为什么不鼓励使用*号返回查询结果列表?

  • 如果使用了联合索引或单索引,索引一般不会覆盖*号,会导致二级索引和回表操作,在命中查询记录非常多的情况下,回表代价相当昂贵。这也是推荐使用覆盖索引,或者使用LIMIT限制回表的记录数

回表的代价

  • 二级索引+聚簇索引
  • 顺序IO+随机IO

索引列的基数大点好

  • 如果某列基数为1,即该列的每个值都相同,没必要建立索引。基数太小,索引效果不明显。

使用字符串前缀作为索引

CREATE TABLE user(
    id INT NOT NULL auto_increment,
    name VARCHAR(200) NOT NULL,
    sooo CHAR(11) NOT NULL,
    PRIMARY KEY (id),
    KEY idx_name_sooo (name(10), sooo) comment '限制name的索引长度为10'
);

好处\color{red}\text{好处}

  • 字符串越长,在索引中占用的存储空间越大。
  • 字符串很长,字符串比较更耗时

坏处\color{red}\text{坏处}

  • 对name排序的时候

对索引列添加运算的表达式用不到索引

  • WHERE column + 2 < 3 ×

  • WHERE column < 3-2 √

最左匹配原则,因为联合索引只对应一棵B+树,同时是有序的嘛

避免重复索引

索引那么好吗?

  • 一个索引一棵B+树,B+树由许多个数据页节点构成,每个数据页16KB
  • 增删改 维护时间