青岛市蓝色经济区建设官方网站,营销网站建设与推广方案,做企业网站需要多久,青岛网站制作服务接上文 mysql从零开始#xff08;3#xff09;
索引
索引是在数据库表的字段上添加的#xff0c;是为了提高查询效率存在的一种机制。一张表的一个字段可以添加一个索引#xff0c;也可以多个字段联合起来添加索引。索引相当于一本书的目录#xff0c;是为了缩小扫描范围…接上文 mysql从零开始3
索引
索引是在数据库表的字段上添加的是为了提高查询效率存在的一种机制。一张表的一个字段可以添加一个索引也可以多个字段联合起来添加索引。索引相当于一本书的目录是为了缩小扫描范围而存在的一种机制。索引是需要排序的索引存储成一个B-Tree数据结构
mysql查询方面有两种方式全表扫描、根据索引检索
原理
在任何数据库当中主键上都会自动添加索引对象id字段上自动有索引因为id是PK。另外在mysql当中一个字段上如果有unique约束的话也会自动创建索引对象。在任何数据库当中任何一张表的任何一条记录在硬盘存储上都有一个硬盘的物理存储编号。在mysql当中索引是一个单独的对象不同的存储引擎以不同的形式存在。 在MyISAM存储引擎中索引存储在一个.MYI文件中 在InnoDB存储引擎中索引存储在一个逻辑名称叫tablespace中 在MEMORY存储引擎当中索引被存储在内存当中 不管索引存储在哪里索引在mysql当中都是一个B-Tree的形式存在。
创建删除查看
何时
数据量庞大全表查询太费时该字段经常出现在where的后面以条件的形式存在即该字段总是被扫描该字段很少进行DML(insert delete update)操作因为DML之后索引需要重新维护
尽管索引可以极大提高查询的效率我们也不应该随意添加索引因为索引底层是B-Tree索引过多的话会使索引维护起来的代价过大。 我们在查询的时候可以尽量通过主键字段、unique字段查询效率较高、代价较小。
语法
# 创建索引
create index 索引名 on 表名(字段名);
# 删除索引
drop index 索引名 on 表名;
# 查看sql语句是否使用了索引检索
explain sql语句;
# 如果type类型是all说明没有使用索引如果是ref说明使用了索引索引失效
模糊查询
select * from test where name like %T;即使name加上了索引也不能使用索引查找。所以在查找时应当尽量避免模糊查询的时候用%开头。
or
使用or做条件筛选时只有or两边的字段都有索引时才会走索引。
复合索引
使用复合索引时要使用左侧的列来查找索引才能生效。如
create index test_id_name on test(id,name);
# 走索引
mysql explain select * from test where id 1;
# 不走索引
mysql explain select * from test where name 1;运算
如果在where中索引列参与了运算索引失效。
# ref
select * from test where id 1;
# all
select * from test where id 1 1;函数
如果在where中索引列使用了函数索引失效
# ref
select * from test where lower(name) tom;视图view
基础知识
视图就是站在不同的角度去看待同一份数据对视图对象的增删改查会影响到原表个人感觉有点像c的引用 创建视图的语句为
create view 视图名 as DQL语句比如
# 创建一个test表的视图
create view test_view as select * from test;
# 删除视图
drop view test_view;对视图对象的增删改查和对原表的操作一样。
作用
视图的主要作用是简化复杂的sql语句就像在编程时我们会将常用的功能单独拿出去写成一个函数一样视图也是起到这样的作用。 假设有一条非常复杂的SQL语句而这条SQL语句需要在不同的位置上反复使用为了防止每一次使用这个sql语句的时候都需要重新编写我们就可以将其以视图对象的形式新建在需要编写这条SQL语句的位置直接使用视图对象可以大大简化开发、利于维护因为修改的时候也只需要修改一个位置就行只需要修改视图对象所映射的SQL语句。 另外需要注意视图不是在内存当中视图对象也是存储在硬盘上的不会消失。
范式
概念
数据库设计范式是数据库表的设计依据按照范式进行设计可以有效避免表中数据的冗余、空间浪费。数据库设计范式共有三个
第一范式第二范式第三范式
第一范式
必须有主键并且每一个字段都是原子性不可再分
个人信息1tom2jack
上面这个表就是不满足第一范式的他没有主键即使将个人信息作为主键也不符合因为个人信息可以分为身份id和姓名
第二范式
满足第一范式所有非主键字段必须完全依赖主键不要产生部分依赖
ID名字朋友ID朋友姓名11tom21T12jack22J13sun21T11tom22J
这张表就是典型的多对对关系每个人都可能有多个朋友。 首先先修改上面这个表使其满足第一范式ID和朋友ID联合作为主键。 但是此时仍然不满足第二范式因为第二范式要求所有非主键字段必须完全依赖主键在此刻名字依赖于ID朋友名字依赖于朋友ID这成为了部分依赖复合主键时这就需要分表。
ID(PK)姓名11tom12jack13sun
朋友ID(PK)朋友姓名21T22J
id(PK)姓名(FK)朋友姓名(FK)11121212223132141122
第三范式
满足第二范式要求所有非主键字典必须直接依赖主键不要产生传递依赖
ID(PK)名字老师ID老师姓名11tom21T12jack22J13sun23S11tom23S
该表是典型的多对一的典型一个老师可能有多个学生 该表满足第一范式有主键 该表满足第二范式主键不是复合主键没有产生部分依赖。主键是单一主键 但是该表不满足第三范式有传递依赖因为老师姓名依赖于老师ID老师ID依赖于ID产生了传递依赖。应该更改为
老师ID(PK)老师名字11T12J13S
ID(PK)姓名老师ID(FK)11tom2112jack2213sun2311tom23