数据库笔记——day05

一、索引 index

1.定义

索引是一种排好序的快速查找的数据结构,它帮助数据库高效的进行数据的检索。
好处:提高查询效率
坏处: 本身是单独的空间来存储

2.分类

  1. 单值索引:一个索引只包含一列
  2. 唯一索引:一个索引只包含一列,值不能重复
  3. 复合索引:一个索引包含多个列
单值索引

create index 索引名 on 表名(字段名)–一个索引只包含一个列

#索引:创建索引+使用索引
#1.查看索引
SHOW INDEX FROM emp;
#2.创建索引
#单值索引:一个索引包含一列
#create index 索引名字 on 表名(字段名); #创建索引
CREATE INDEX nameindex on emp(ename)
#3.使用索引,发起select语句
SELECT * FROM emp WHERE ename='jack'
#4.检查SQL的执行效率(观察用没有索引)
EXPLAIN #解释说明SQL的指向计划/性能(观察possible_keys的值)
SELECT * FROM emp WHERE ename='jack'

#练习:
CREATE INDEX jobindex ON emp(job)#单值索引
SHOW INDEX FROM emp#查看索引
EXPLAIN SELECT * FROM emp WHERE job='员工'#检查是否使用了索引
唯一索引

create unique index 索引名 on 表名(字段名)
一个索引只包含一个列,列的值不能重复

#创建唯一索引--索引列的值必须唯一
#CREATE UNIQUE INDEX 索引名 ON 表名(字段名)
#CREATE UNIQUE INDEX locindex ON dept(loc) #添加失败,因为loc的值有重复的
CREATE UNIQUE INDEX dnameindex on dept(dname)
SHOW INDEX FROM dept   #查看索引
#使用索引
EXPLAIN SELECT * FROM dept WHERE dname='research'
复合索引

create index 索引名 on 表名(字段名1,字段名2,字段名3…)
一个索引包含多个字段,用时要遵循最左原则,否则复合索引失效

#创建复合索引
#如果您希望索引不止一个列,您可以在括号中列出这些列的名称,用逗号隔开:
#CREATE INDEX 索引名 ON 表名 (字段1, 字段2)
CREATE INDEX fuheIndex on emp(ename,job,deptno)
SHOW INDEX FROM emp
#用的时候可能会让复合索引失效——遵循最左原则
EXPLAIN SELECT * FROM emp WHERE ename='jack' #生效
EXPLAIN SELECT * FROM emp WHERE job='总监' #失效
EXPLAIN SELECT * FROM emp WHERE ename='jack' AND job='副总' #生效
EXPLAIN SELECT * FROM emp WHERE job='副总'AND ename='jack'#生效
删除索引
#7.删除索引
SHOW INDEX FROM emp
ALTER TABLE emp DROP INDEX jobindex
优点
  • 索引是数据库优化
  • 表的主键会默认自动创建索引
  • 每个字段都可以被索引
  • 大量降低数据库的IO磁盘读写成本,极大提高了检索速度
  • 索引事先对数据进行了排序,大大提高了查询效率
缺点
  1. 索引本身也是一张表,该表保存了主键与索引字段,并指向实体表的记录,所以索引列也要占用空间
    索引表中的内容,在业务表中都有,数据是重复的,空间是“浪费的”
  2. 虽然索引大大提高了查询的速度,但对数据的增、删、改的操作需要更新索引表信息,如果数据量非常巨大,更新效率就很慢,因为更新表时,MySQL不仅要保存数据,也要保存一下索引文件
  3. 随着业务的不断变化,之前建立的索引可能不能满足查询需求,需要消耗我们的时间去更新索引

二、视图

概念

是一个特殊的表,存了上次查询的结果.

练习

#视图:创建视图+使用视图
#练习:查询名字里有a的员工信息
SELECT * FROM emp WHERE ename LIKE '%a%'
1.创建视图:create view 视图名 as select语句
CREATE VIEW empview AS 
SELECT * FROM emp WHERE ename LIKE '%a%'
#2.使用视图
SELECT * FROM empview
#好处:提高了SQL的复用性+屏蔽了业务表的复杂性+数据共享
#坏处:是一张单独的表存了业务表的数据造成了数据重复+无法优化

三、SQL优化

  1. 查询SQL尽量不要使用select *,而是具体字段
  2. 避免在where子句中使用or来连接条件
  3. 使用varchar代替char
  4. 尽量使用数值替代字符串类型
  5. 查询尽量避免返回大量数据
  6. 索引不宜太多,一般5个以内
  7. 索引不适合建在有大量重复数据的字段上
  8. 使用explain分析你SQL执行计划
  9. 不要有超过5个以上的表连接
  10. 避免在where子句中使用!=或<>操作符
  11. where中使用默认值代替null
  12. 去重distinct过滤字段要少
  13. inner join 、left join、right join,优先使用inner join
  14. 批量处理:
    批量查,批量的删,最好使用分页

四、三范式

数据库的专业术语,用来设计表要遵循的原则,范式NF

分为六大范式,通常只要遵循前三大范式就可以了

第一范式1NF

表里的字段 不可分割
是指字段的值就是最小单位
简而言之,第一范式就是无重复的列

第二范式2NF:

基于第一范式的基础上产生的,
指表里都应该设计主键/主关键字/主属性
每行都应该围绕着主键来 描述数据
总之,第二范式就是非主属性完全依赖于主关键字

第三范式3NF:

基于第二范式的基础上产生的,
是指表里的字段之间尽量不要产生依赖,
总之,第三范式就是属性不依赖于其它非主属性

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值