索引
1 什么是索引
索引是对数据库表中一列或多列的值进行排序的一种结构,在现实生活中有许多地方使用到索引,例如 公交车站牌是索引、办公楼指示牌是索引、书的目录是索引、字典里边的偏旁部首查询是索引等。
使用索引好处:可以非常快速定位我们需要找到的信息。
2.索引为什么速度快
从技术本身的角度看索引,索引就是一种数据结构(寝室大楼),数据结构内部有算法,可以帮组我们快速、准确定位需要的信息。
3.索引创建
数据表的全部字段都可以创建索引
索引类型:
① 主键索引(值不重复,auto_increment自增特性)
② 唯一索引(字段内容不能重复)
③ 普通索引
④ 全文索引(把一个文章的内容都给创建索引)
(mysql5.6.4之前只有Myisam支持全文索引,之后 Myisam和Innodb都支持。)
目前mysql中只有英文支持全文索引,一般都是借助第三方软件(sphinx)使用全文索引,不使用mysql本身的。
复合索引:多个字段组成索引
前缀索引
什么是前缀索引:
如果一个字段内容的前边的n位信息已经足够标识当前的字段内容,就可以把字段的前n位获得出来并创建索引,通过字段内容前n位创建的索引就称为“前缀索引”。
例如:
关伟
吕纪无
刘尚
王云斐
以上字段内容,通过前1位,就可以唯一标识当前字段内容,这样就把前1位取出来创建索引
好处:索引占据的物理空间要比较小,这样的索引运行速度快、效率高,对mysql整体性能提升有很大帮助。
具体操作:
alter table 表名 add key (字段(前n位位数))
到底是前几位可以标识当前字段内容?
通过substring获得字段的前n为信息,从1开始递增时获取
获取的时候去除重复的,计算总数目,不断增加n的数值,直至总个数稳定
此时n的数值就是适合做”前缀索引”的数字。
select count(distinct substring(epassword,1,11)) from emp;
索引是给sql语句做优化
前缀索引,是给索引做的优化
获得字段的前n为:substring(字段,开始位置,长度n)
in条件索引使用
有的字段经常使用in作为条件进行数据查询获取,则该字段可以设置索引。
全文索引注意
① 字段类型必须为varchar/char/text类型
② mysql 5.6.4之前只有Myisam支持,5.6.4之后则Myisam和innodb都支持。
③ mysql中的全文索引目前只支持英文(不支持中文),如果需要支持中文可以使用sphinx
④ 生产活动中mysql的全文索引不常使用,sphinx常使用
⑤ mysql全文索引会自作聪明,对关键字的收录有自己的考虑。
例如生活常用单词、频繁使用单词都不给创建索引(比如 for when where run等等)
4.索引适合场合
注意:有的字段重复内容很多(例如性别字段),则不要设置索引,不会起作用。
① where条件后边的字段都可以设置索引
select 字段 from 表名 where 条件字段
② 排序字段适合做索引
③ 索引覆盖
做数据查询,查询的字段就是索引的内容,言外之意不获得其他字段信息。
像这样已经完全满足查询数据需要的索引称为“索引覆盖”。
查询的ename,job既是结果字段、也是复合索引字段,该查询速度就是最快的
上图使用no的索引也称为是“黄金索引”。因为结果字段(索引字段)就满足内容的获取,其不用再关联地址获取其他字段了。
④ 连接查询
select from 表1 join 表2 on 表1.字段=表2.字段
上边sql语句的表1.字段 也称为“外键字段”
外键字段也适合做索引。
5.索引原则
① 字段独立原则
② 左原则
模糊查询
关键字:like % _
%: 代表一个或多个模糊内容
_: 代表一个模糊内容
select * from emp where ename like ‘%xiaoming%’;
模糊查询是否可以使用索引分为具体情形
左边内容固定则可以使用索引,否则不可以
like ‘bill%’; //ok
like ‘%bill’;
like ‘bill_’; //ok
like ‘_bill’;
复合索引详细说明 https://blog.csdn.net/u010003835/article/details/51563353
④ or原则
a.左右都有索引,会合并索引一起使用
b.一边有索引、一边没有索引,导致整体都没得索引使用
6.索引结构(了解)
索引就是数据结构, 数据以一定的结构组织起来,内部嵌入算法,该结构可以保证算法运行起来。
主要讨论两种:Myisam 和 Innodb
Mysql的索引数据结构都是B+tree结构(了解相关的数据结构B-tree、二叉树等等)
数据结构:数据以一种规律的、规则的方式组织在一个格式里边,可以保证我们获得数据的快速性。
6设计依据
① 被频繁使用的字段设置索引
字段被频繁用在where和order等条件里边。
数据表创建完毕,要预估那些字段被经常使用,就给其创建索引
② 执行时间长的sql语句考虑设计索引
可以利用”慢查询日志”收集这样的sql语句并优化设计索引
③ 逻辑非常重要的sql语句考虑设计索引
例如商城系统里边,会员给自己账户充值就比较重要
还有会员下订单购物,进行付款的时候也比较重要。
④ 字段内容足够花样化,可以考虑设计索引
反面教材,性别不能设计索引(内容的取值非常少)
缓存设置
有的sql语句被频繁执行,其比较消耗时间、消耗系统资源(没的优化可做)
并且每次获得数据还不太发生变化
那么就把这个sql语句获得信息给缓存起来,供后续执行使用
这样非常节省系统资源。
show variables like ‘query_cache%’; //查看缓存空间大小
set global query_cache_size=大小; //设置缓存空间大小