mysql-索引-Index
一、索引:Index:
- 1、命名规范:首单词字母小写第二单词开始每个单词首字母大写;
- 2、mysql:查询方面主要两种方式:全盘扫描、按照索引查询
- 3、索引排序:mysql数据库中索引需要排序,数据结构是:B-Tree 数据结构; 遵循左小右大原则存放,采用中序遍历方式遍历
- 4、索引作用:为缩小扫描范围而存在的机制。(缩小扫描区间) 是在数据库表的字段上添加的,是为了提高查询效率存在的一种机制;
- 一张表的一个字段可以添加一个索引,多个字段联合起来也可以添加索引
- 5、索引实现原理:主键,以及unique 字段上都会自动添加索引的!
二、索引:什么条件下,我们会考虑给字段添加索引
- 条件1:数据量庞大(这个需要测试,每一个硬件环境不同)
- 条件2:该字段经常出现在where后面,以条件形式存在, 也就是这个字段经常被扫描。
- 条件3:该字段很少DML(增删改查:insert、delete、update)操作,(因为DML之后索引需要重新排序)
- 建议不要随意添加索引,索引是需要随时维护,太多的话反而会降低系统性能,建议通过unique约束字段进行,查询效率也是比较高的;
三、索引:Index 创建:
- 创建索引:create index emp_ename_index on emp(ename);
- 删除索引:drop index emp_ename_index on emp;
- 在mysql中如何查看一个字段是否使用了索引? explain select * from emp where ename = 'KING';
四、索引失效:模糊查询、使用关键字or(两边条件字段都有索引不会失效)、复合索引、索引字段参加运算
- 1、模糊查询:ename上即使添加索引也不会走索引,原因是模糊匹配当中以“%”开始,尽量避免模糊查询时使用%开始;
- 失效语句:select *from emp where ename like '%T';
- 2、失效第二种情况: 使用or 的时候会失效,如果使用or那么要求or两边的条件字段都要有; 索引,才会使用索引。
- 失效语句: explain select * from emp where ename ='KING'or job = 'MANAGER;'
- 3、失效的第三种情况: 使用复合索引,没有使用左侧的列查找,索引失效;查询时使用左侧列查询不会失效。使用右侧列查询失效
- 语句:create index emp_job_sal_index on emp (job(左侧列),sal(右侧列));
- 左侧列查询不会失效:explain select * from emp where job = 'MANAGER';
- 右侧列查询失效: explain select *from emp where sal = 800;
- explain select *from emp where sal = 800;
- 4、where中索引列字段(sal+1)参加运算,索引失效, 在where当中索引列使用了函数