什么是索引?
索引是协助数据库快速查找数据的一种数据结构
在数据库中,查询一张表有两种方式:
第一种方式:全表扫描
第二种方式:根据索引检索
索引为什么可以提高检索效率呢?
最根本的原理是缩小了扫描的范围
索引虽然可以提高检索效率,但是不能随意的添加索引,因为索引也是数据库当中的对象,也需要数据库的维护。比如,表中的数据经常被修改这样就不适合添加索引,因为数据一旦修改,索引需要重新排序。
(1)用select *数据库需要解析更多的字段,在sql语句复杂的情况下,会对数据库造成沉重的负担。
(2)增大网络开销:当无用的字段是一些大文本字段的时候,如果DB和应用程序不在同一台机器,这种开销就非常明显。
(3)失去Mysql优化器“覆盖索引”策略优化的可能性:比如说一张表中存在一个主键索引和一个辅助索引。在mysql中,如果查询条件中where条件可以通过普通索引过滤掉一部分记录,查询会先走普通索引,如果用户只需要加了辅助索引列的数据,那么直接通过辅助索引就可以知道用户查询的数据。如果用户通过select *,获取了不需要的数据,则首先通过辅助索引过滤数据,然后再通过聚集索引获取所有的列,这就多了一次b+树查询,速度必然会慢很多。
怎么创建索引,怎么删除索引
创建索引语法:create index 索引名称 on 表名(字段名)
create index emp_sal_index on emp(sal);
删除索引对象:drop index 索引名称 on 表名;
什么时候考虑添加索引
*数据量庞大(根据客户的需求,线上的环境)
*该字段很少的DML操作
*该字段经常出现在where子句中
注意:主键和具有unique约束的字段自动会添加索引
索引的分类:
单一索引:给单个字段添加索引
复合索引:给多个字段联合起来添加1个索引
主键索引:主键上会自动添加索引
唯一索引:有unique约束的字段会自动添加索引
说说最左匹配?
以最左边的字段为起点任何连续的索引都能匹配上,当遇到范围查询(>、<、between、like)就会停止匹配
聚簇索引:
1>只能来自于采用Innodb存储引擎表的数据
2>mysql自动将采用Innodb存储