指定索引 #
使用FORCE INDEX关键字强制使用指定的索引,强制使用指定的索引
SELECT * FROM table FORCE INDEX (index_name)
WHERE condition;
使用USE INDEX关键字建议使用指定索引,优先使用指定的索引
SELECT * FROM table USE INDEX (index_name)
WHERE condition;
STRAIGHT_JOIN
强制按书写顺序连接JOIN表,固定连接顺序
索引分类 #
按数据结构分类索引 #
- B+tree索引
- Hash索引
- Full-text索引
按物理存储分类索引 #
- 聚簇索引(主键索引)
- 二级索引(辅助索引)
按字段特性分类索引 #
- 主键索引
- 唯一索引
- 普通索引
- 前缀索引
按字段个数分类索引 #
- 单列索引
- 联合索引
优化 #
覆盖索引 #
这种在二级索引的 B+Tree 就能查询到结果的过程就叫作「覆盖索引」,也就是只需要查一个 B+Tree 就能找到数据
CREATE INDEX user_name_age ON user(name, age);
SELECT name, age FROM user WHERE name = 'Tom';
索引下推 #
索引下推优化(index condition pushdown), 可以在联合索引遍历过程中,对联合索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数
# 若存在index(username,age) , 有索引下推就会减少回表,判断username的同时不急着回表再判断age
select * from user2 where username like 'j%' and age=99;
最左匹配原则 #
使用联合索引时,存在最左匹配原则,也就是按照最左优先的方式进行索引的匹配
前缀索引 #
是使用某个字段中字符串的前几个字符建立索引
索引区分度 #
建立联合索引时,要把区分度大的字段排在前面,这样区分度大的字段越有可能被更多的 SQL 使用到。
区分度=distinct column / count
区分度大前面,以小驱动大
主键索引最好是自增的 #
插入一条新记录,都是追加操作,不需要重新移动数据
索引最好设置为 NOT NULL #
行格式中至少会用 1 字节空间存储 NULL 值列表
防止索引失效 #
- 对索引隐式类型转换