为什么不鼓励使用*号返回查询结果列表?
- 如果使用了联合索引或单索引,索引一般不会覆盖*号,会导致二级索引和回表操作,在命中查询记录非常多的情况下,回表代价相当昂贵。这也是推荐使用覆盖索引,或者使用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'
);
- 字符串越长,在索引中占用的存储空间越大。
- 字符串很长,字符串比较更耗时
- 对name排序的时候
对索引列添加运算的表达式用不到索引
-
WHERE column + 2 < 3 ×
-
WHERE column < 3-2 √
最左匹配原则,因为联合索引只对应一棵B+树,同时是有序的嘛
避免重复索引
索引那么好吗?
- 一个索引一棵B+树,B+树由许多个数据页节点构成,每个数据页16KB
- 增删改 维护时间