1. 什么是索引?使用索引的优劣?
索引是帮助mysql高效获取数据的数据结构。所以说索引是数据结构。
索引的优势: 索引大大减少了服务器需要扫描的数据量 索引可以帮助服务器避免排序和临时表 索引可以将随机I/O变为顺序I/O
索引的劣势:实际上索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录,所以索引列也要占用空间的。同时在更新表时也要更新索引,有时间成本。
2.索引的分类
按索引是否包含记录数据:聚簇索引(包含数据) 非聚簇索引(也叫二级索引,不包含数据)
按索引是否建立在主键上:主键索引 辅助索引
按索引底层的数据结构:HASH索引 B+Tree索引 (mysql大部分存储引擎支持的都是BTREE)
按索引的常规功能:
单值索引:一个索引只包含单个列,一个表可以有多个单列索引,建议不超过5个
复合索引:一个索引包含多个字段,如账号+密码构成一个复合索引
主键索引(PRIMARY): 表中主键创建的索引,只能有一个,不允许为NULL
唯一索引(UNIQUE):索引值的列必须唯一,可以有多个,允许为NULL
全文索引(FULLTEXT): 全文索引查找文本中的关键词,而不是比较索引中的值,可以有多个
3.什么情况建立索引
1》主键自动建立唯一索引
2》频繁作为查询条件的字段
3》查询与其他表关联的字段,即外键关系建立索引
4》查询中排序,统计和分组的字段
4.索引的sql语法
创建索引:
1.建表的时候就创建索引
create table t_dept(
id int not null primary key,
name varchar(20) null,
sex varchar(2) null,
info varchar(20) null,
index index_id(id)
)
2.在已建表中添加索引
create index 索引名称 on 表名(字段名)
eg:create index index_name on t_dept(name)
3.以修改表的方式添加索引
alter table 表名 add index 索引名(字段名)
eg:alter table t_dept add index index_name(name);
查看索引
show index from 表名
删除索引
drop index 索引名 on 表名
5.索引失效的场景
1.模糊查询:like '%';like '%%'通配符放在开头会导致索引失效。会进行全表扫描
2.WHERE 子句中使用OR连接:当or前后都是索引列的时候不会导致索引失效,但当or前后有一个不是索引列的时候索引就会失效
3.索引列使用运算符,!=或者not:类似使用函数。