哪些字段作为索引?
- 具有唯一性的字段,例如学号。 (唯一索引)
- 频繁作为 where 查询条件的字段。
- 经常 group by 和 order by 的列
- update、delete 的 where 列
- distinct 字段需要创建索引
- 多表 join
- 连接的表尽量不超过 3 张
- where 条件创建索引
- on 连接字段创建索引
- 使用列的类型小(数据范围小,tinyint、mediumint、int、bigint)的创建索引
- 字符串很长时,使用字符串前缀创建索引
- 区分度高的列适合作为索引
- 使用最频繁的列放到联合索引的左侧
- 在多个字段都要创建索引的情况下,联合索引优于单值索引
- 限制索引的数量
哪些字段不建议作为索引?
- where 用不到的字段
- 数据量小的表最好不要使用索引
- 有大量重复数据的列
- 经常更新的表
- 不建议用无序的值作为索引
- 删除不再使用或者很少使用的索引
- 不要定义冗余或重复的索引
数据库调优
- 索引失效,没有充分利用到索引。--- 索引建立
- SQL 语句优化,避免全表扫描。 --- 索引优化
- 合理控制索引的数据,不是索引越多越好,索引过多会导致插入、更新、删除变慢。 --- 索引优化
- 关联查询太多 join --- SQL 优化
- 服务器调优 --- 调整 my.cnf
- 数据过多 --- 分库分表
索引失效
- 最佳左前缀法则
多列索引,过滤条件要使用索引必须按照索引建立时的顺序,依次满足,一旦跳过某个字段,索引后面的字段都无法被使用。
- 主键插入顺序
UUID
作为主键会导致在插入数据时,造成 页分裂
和 记录位移
。
- 计算、函数、类型转换导致索引失效
LEFT(name,3) = 'abc'
stuno + 1 = 90001
!=
、 <>
索引失效
!=
、 <>
过滤得到的数据太多,导致**回表**
次数太多,还不如进行全表扫描。
is null
可以使用索引,is not null
无法使用索引
like
以通配符 %
开头索引失效。
or
前后存在非索引的列,索引失效。