4. 范式
4.1 三范式
1 范式:字段设计原子型,不能分割
2 范式:字段与主键id关联
3 范式:字段 与主键id直接关联
4.2 逆范式
不遵守三范式,称为”逆范式“,在分类表中记录对应商品的数目,方便后期查询
5. 索引
主键索引(primary key)
索引是进行数据库设计的时候,提升性能最有效的一个技术,索引字段对应记录的物理地址;从技术本身的角度看索引,索引就是一种数据结构,内部有算法,可以帮助我们快速,准确定位需要的信息。
5.1 索引创建
数据表的全部字段都可以创建索引
索引类型:
1)主键索引 primary key
2)唯一索引 unique key
3)普通索引 key
4)全文索引 fulltext key(把一个文章的内存都给创建索引。mysql5.6.4之前只有Myisam支持全文索引,之后Myisam和Innodb都支持)
5)复合索引
5.1.2 创建数据表同时设置索引
5.1.3 给存在的数据表增加索引
5.2 删除索引
注意:”删除主键索引,必须先去除auto_increment属性
5.3 执行计划explain
执行计划:一条sql语句在没有执行之前,先把需要的资源都计划好,例如CPU,内存等资源的分配预计,该形成的就称为”执行计划“
我们就只研究一条sql语句是否是使用到”索引“
1)使用到索引,耗费资源少,查询速度快
2)没有使用索引,耗费资源多,查询速度慢
通俗说,只有关联到索引的sql语句,才是优化的sql语句
目前,只有”查询sql“语句支持做执行计划
没有使用索引
5.3 索引适合场合
注意: 有的字段重复内存很多(性别字段),则不要设置索引,不会起作用
1)where 条件后边的字段都可以设置索引
2)排序字段适合做索引
3)索引覆盖
做数据查询,查询的字段就是索引的内容
这样索引本身就支持数据的提供,其已经不获得具体其他字段信息
数据查询只通过索引内存就获得需要的信息,就称为”索引覆盖“
4)连接查询
select from 表1 join 表2 on 表1.字段=表2.字段
上边sql语句的表1.字段 也称为“外键字段”
外键字段也适合做索引。
5.4 索引原则
1)字段独立原则
select * from emp where empno=1345629; //字段独立,可以使用索引
select * from emp where empno+2=1345629; //字段不独立(不能使用索引)
2) 左原则
注意:数字内部不要使用like(没有索引可用)
模糊查询的时候,有可能用到索引,也有可能不能使用索引
例如:
select * from emp where ename like “%内容%”;
select * from emp where ename like “tom_”; //toma、tomb、tomtt
%符号:代表对应位置出现1或多个其他内容
_符号:代表对应位置出现1个其他内容
模糊查询左边内容固定的时候可以用到索引,否则不能使用
select * from emp where ename like “内容%”; //能用索引
select * from emp where ename like “%内容%”; //不能用索引
select * from emp where ename like “内容__”; //能用索引
select * from emp where ename like “_内容__”; //不能用索引
3) 复合索引
复合索引的第一个字段,单独作为条件可以使用到该索引,第二字段单独作为条件不能成为索引,两个字段作为条件也可以成为索引
4)or 原则
两边都有索引,则会全部都分别使用
一个有索引,另一个没有索引,导致结果后没得使用索引
总结:
1. 逆范式
不要太遵守三范式,称为“逆范式”
在分类表中记录对应商品的数目,方便后期查询
三范式:
1范式:字段设计原子型,不能分割
2范式:字段与主键id关联
3范式:字段与主键id直接关联
2. 索引
索引就是数据结构,数据结构里边有算法
创建索引:创建表同时设置、后期给已经存在数据表设置
删除索引:
删除主键索引,先取出主键的auto_increment属性
alter table 表名 drop primary key;
alter table 表名 drop key 索引名称;
执行计划:explain
分析sql语句是否使用到索引
只针对select查询语句起作用
索引使用场合:
① where后边字段
② order by 排序
③ 索引覆盖
④ 连表查询 (外键设置索引)
索引原则
① 字段独立
② 左原则(模糊查询时)
③ 复合索引
④ or原则