索引( index )是帮助 MySQL 高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。

索引分类
主键索引:默认创建,只有一个,value 保存所有信息
唯一索引:避免值重复
常规索引:快速定位特定数据
全文索引:查找的是文本中的关键词
聚集索引:value 保存行数据,只有一个,如果有主键就是主键
二级索引:value 为主键,然后再去主键索引查找元素(这种两次查询称为回表查询)
索引语法:

# 创建索引
create [unique | fulltext] index index_name on table_name (index_col_name,...);
# 查看索引
show index from table_name;
# 删除索引
drop index index_name on table_name;

# 常规索引
CREATE INDEX idx_user_name ON tb_user(name);
# 联合索引
CREATE INDEX idx_user_pro_age_sta ON tb_user(profession,age,status);

索引失效

# 不满足最左前缀法则
explain select * from tb_user where substring(phone,10,2) = '15';
# 字符串不加引号
explain select * from tb_user where phone = 18888888888;
# or 连接条件,都有索引,才会生效
# mysql 自己评估全局扫描更快

索引设计原则
为数据量大,查询频繁的表建立索引
针对常作为查询条件、排序、分组操作的字段建立索引
尽量选择区分度高的列作为索引,尽量建立唯一索引,区分度越高,使用索引的效率越高
尽量使用联合索引,减少单列索引,查询时,联合索引很多时候可以覆盖索引,节省存储空间,避免回表,提高查询效率
如果是字符串类型的字段,字段的长度较长,可以针对于字段的特点,建立前缀索引
如果索引列不能存储 NULL 值,在创建表时使用 NOT NULL 约束它