一、索引
1、什么是索引
搜索引导, 所以是一种单独的,物理的 有序的 存储结构,用于加速查询
是mysql中一种专门的数据结构,称为key
例如: 字典 书的目录 车票上的车厢号
索引的本质原理就是通过不断地缩小查询范围,来降低io次数从而提升查询性能
强调:一旦为表创建了索引,以后的查询都会先查索引,再根据索引定位的结果去找数据
2、为什么用索引
因为项目运行中,查询操作非常频繁,为了提高用户体验,要提高查询的速度,
如何提高就靠索引
索引的影响:
1.加速查询
2.降低写入(增加 删除 修改)速度
3.会额外占用磁盘空间
3、怎么用索引
先了解索引的原理和数据结构http://www.cnblogs.com/linhaifeng/articles/7274563.html#_label3
(1)聚焦索引
通常我们所说的主键
特点:叶子节点存放的一整条数据
(2)辅助索引:除了主键的索引
特点:
如果是按照这个字段创建的索引,
那么叶子节点存放的是:{名字:名字所在那条记录的主键的值}
覆盖索引:只在辅助索引的叶子节点中就已经找到了所有我们想要的数据
(3)mysql中的索引:主键、外键、index索引
举个例子来说,比如你在为某商场做一个会员卡的系统。 这个系统有一个会员表 有下列字段: 会员编号 INT 会员姓名 VARCHAR(10) 会员身份证号码 VARCHAR(18) 会员电话 VARCHAR(10) 会员住址 VARCHAR(50) 会员备注信息 TEXT 那么这个 会员编号,作为主键,使用 PRIMARY 会员姓名 如果要建索引的话,那么就是普通的 INDEX 会员身份证号码 如果要建索引的话,那么可以选择 UNIQUE (唯一的,不允许重复) #除此之外还有全文索引,即FULLTEXT 会员备注信息 , 如果需要建索引的话,可以选择全文搜索。 用于搜索很长一篇文章的时候,效果最好。 用在比较短的文本,如果就一两行字的,普通的 INDEX 也可以。 但其实对于全文搜索,我们并不会使用MySQL自带的该索引,而是会选择第三方软件如Sphinx,专门来做全文搜索。
(4)索引的两大类型hash与btree
#我们可以在创建上述索引的时候,为其指定索引类型,分两类 hash类型的索引:查询单条快,范围查询慢 btree类型的索引:b+树,层数越多,数据量指数级增长(我们就用它,因为innodb默认支持它) #不同的存储引擎支持的索引类型也不一样 InnoDB 支持事务,支持行级别锁定,支持 B-tree、Full-text 等索引,不支持 Hash 索引; MyISAM 不支持事务,支持表级别锁定,支持 B-tree、Full-text 等索引,不支持 Hash 索引; Memory 不支持事务,支持表级别锁定,支持 B-tree、Hash 等索引,不支持 Full-text 索引; NDB 支持事务,支持行级别锁定,支持 Hash 索引,不支持 B-tree、Full-text 等索引; Archive 不支持事务,支持表级别锁定,不支持 B-tree、Hash、Full-text 等索引;
(5)创建/删除索引的语法
#方法一:创建表时 CREATE TABLE 表名 ( 字段名1 数据类型 [完整性约束条件…], 字段名2 数据类型 [完整性约束条件…], [UNIQUE | FULLTEXT | SPATIAL ] INDEX | KEY [索引名] (字段名[(长度)] [ASC |DESC]) ); #方法二:CREATE在已存在的表上创建索引 CREATE [UNIQUE | FULLTEXT | SPATIAL ] INDEX 索引名 ON 表名 (字段名[(长度)] [ASC |DESC]) ; #方法三:ALTER TABLE在已存在的表上创建索引 ALTER TABLE 表名 ADD [UNIQUE | FULLTEXT | SPATIAL ] INDEX 索引名 (字段名[(长度)] [ASC |DESC]) ; #删除索引:DROP INDEX 索引名 ON 表名字;
(6)索引的使用
1.无论索引如何设计 无法降低范围查询的查询速度
select count(*) from usr where id > 1;
即使命中索引也无法提高效率
2.索引不应该加在值重复度很高的字段上 应该加在重复度低的字段
3. 使用and时 当 条件中出现多个索引命中时 会自定找一个区分度最高的索引来使用
4.使用or的时候 如果两边都有索引 会使用索引,但是注意 or两边都要执行 顺序依然从左往右
只有一边有索引会不会使用索引? 不会使用 无法加速查询
5.优化查询 不仅仅要加索引,sql语句也需要优化 使其能命中索引
你的条件中应该使用区别度高的索引
6.联合索引
为是什么使用它
降低资源的占用 , 降低增删改的时间 会比单个字段的索引快
建立联合索引时 应该把区分度高放最左边 区分度低的依次往右放
按照区分度的高低 从左往右 依次排列
查询中 应该优先使用左边的索引
使用and时 无所谓书写顺序 会自动找区分度最高的
注意联合索引在查询时 如果压根没用到最左侧索引 不能加速查询
正常开发时
优先使用聚集索引
再次 使用联合索引 如果你的条件不包含最左侧索引 不能加速查询 这时候就应该使用单个字段索引
创建索引:
create index 索引名称 on usr(索引字段);