文章来源于前辈的讲解,我只是个平平无奇笔记搬运工
目录
一、视图
因为创建的视图时select语句,所以里面的属性改变值得时候视图得值也会改变
二、索引
索引是一种特殊的文件,它们包含着对数据表里所记录得引用指针,数据库索引时数据库管理系统中一个排序得数据结构,以协助快速查询、更新数据库表中数据,索引得实现通常使用β数以及变种β+数
1、概念
索引概念: a)索引是一种特殊的文件,它们包含着对数据表里所有记录的引用指针 b)索引本身也是储存在磁盘中的 c)添加索引可以提高数据库的查询速度 d)可以理解书中的目录
3、类型
4、优缺点
索引的优点: 可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
索引的缺点: 时间方面:创建索引和维护索引要耗费时间,具体地,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,会降低增/改/删的执行效率; 空间方面:索引需要占物理空间
5、索引得原理
索引用来快速地寻找那些具有特定值的记录。如果没有索引,历整张表。索引的原理很简单,就是把无序的数据变成有序的查询。. 1.把创建 了索引的列的内容进行排序| 2.对排序结果生成倒排表 3.在倒排表内容上拼上数据地址链 4.在查询的时候, 先拿到倒排表内容,再取出数据地址链,从而拿到具体数据
6、创建索引得原则
给字段添加索引是为了提高查询效率,但不是所有的字段都可以添加索引,以下特点。 1.在经常需要搜索的列上,可以加快搜索的速度; 2.在作为主键的列上,强制该列的唯--性和组织表中数据的排列结构; 3. 在经常用在连接的列上,这些列主要是- -些外键,可以加快连接的速度; 4.在经常需要排序的列上创建索引,因为索引已经排序,加快排序查询时间 5.更新频繁的字段不建议设置索引 6.尽量的扩展索引,不要新建索引。比如表中已经有a的索引,现在要加(a,b)的索引,那么只需要修改原来的索引即可。 7.定义有外键的数据列一定要建立索引。 8.对于那些查询中很少涉及的列,重复值比较多的列不要建立索引。 9.对于定义为text、image和bit的数据类型的列不要建立索引
三、数据库中实现索引得命令
四、触发器
在MySQL里面也就是对某一个表的一定的操作,触发某种条件( Insert,Update,等),从而自动执行的一段程序和Web中学过的监听器很像。
1、创建触发器
五、SQL命令语言
(imterferce中判断) DDL:数据库定义语言 DML:数据库操作语言 DQL:数据库查询语言
优化:optimizer(部分)
日志缓存负责回复数据库
模糊查询在查询中添加like来模糊查询
2、使用资源
①使用cpu
查看profile第二哥文件得使用cpu 得情况
②内存
3、优化sql依据——show profile
1.show profile默认是关闭的,并且开启后只存活于当前会话,也就说每次使用前都需要开启。 2.通过show profiles查看sql语句的耗时时间,然后通过show profile命令对耗时时间长的sq语句进行诊断。 3.注意show profile诊断结果中出现相关字段的含义,判断是否需要优化sq语句。
4、数据锁
一个事务运行,还未提交得时候数据就会被锁,另一个事务只有查询得权力没有操作得权力
六、存储引擎
1、解释
a)根据不同的储存方式(读取,修改)对数据进行磁盘的储存
b)因为各个储存索引的方式都不一样,所以各有自己的特点
2、有哪些:MyISAM,Innodb
3、区别:如上
4、场景选择:增删改用Innodb,查用MyISAM
七、解释计划
1、概念
EXPLAIN命令是查看查询优化器如何决定执行查询的主要方法,使用EXPLAIN,只需要在查询之前增加EXPLAIN这个词即可,MYSQL会在查询上设置一个标记,当执行查询时这个标记会使其返回关于在执行计划中每一步的信息,而不是执行它,它会返回一行或多行信息,显示出执行计划中的每一部分和执行的次序,从而可以从分析结果中找到查询语句或是表结构的性能瓶颈。可以通过查看explain查看的属性来进行数据库的优化
例如:
查看id了解语句执行顺序,从而优化sql语句
通过查看selectType来了解使用的链接类型,选择最适合的类型
通过查看type来了解查询类型,从而优化数据库的语言
2、作用
1.分析出表的读取顺序 2.数据读取操作的操作类型 3.哪些索引可以使用 4.哪些索引被使用 5.表之间的引用 6.每张表有多少行被优化器查询
3、id
1、使用的普通
如下所示在执行的代码前用了explain的时候结果不会显示执行的效果,只会显示执行流程的情况
2、当id一致
出现id一致的情况下,排在前的先执行
例如下面就是先执行t1表,再执行t2表
EXPLAIN
select * from t. user u1
where u1.id in(
select u.id from t_user u
where u.id = 2)
3、当id不一致的时候
当id不一致的时候。id越大越先执行
例如下图,限制性最大的id3,再执行2,最后执行1
EXPLAIN
select * from t. user u1,t user u2
where u1.id =(
select u.id from t user u
where u.id = 2)
4、selectType
查询的类型,主要用于区别普通查询,联合查询,子查询等复杂查询
●simple:简单的select查询,查询中不包含子查询或union查询
●primary: 查询中若包含任何复杂的子部分,最外层查询则被标记为primary(最后一个查询)
●subquery:在select或where列表中包含了子查询
●derived 在from列表中包含的子查询被标记为derived,mysql会递归这些子查询,把结果放在临时表里
●union做第二个select出现在union之后,则被标记为union,若union包含在from子句的子查询中,外层select将被标记为derived
●union result union之后的结果集产生
simple
primary
union
5、type
显示一行的数据来源于哪个表
查询类型从最好到最差依次是:system>const>eq_ref>range>index>All
一般情况 下,得至少保证达到index级别,最好能达到ref。
system:表只有一行记录,这是const类型的特例,平时不会出现
const:表示通过索引一次就找到了,const即常量,它用于比较primary key或unique索引,因为只匹配一行数据 所以效率很快,如将主键置于where条件中,mysql就能将该查询转换为一个常量
eq_ ref唯一性索引扫描,对于每 个索引键表中只有一条记录与之匹配,常见于主键或唯一索引扫描,需要出现的结果是唯一索引的时候要求他搜索的字段也要是唯一的
ref:非唯一性索引扫描,返回匹配某 个单独值的行,它可能会找到多个符合条件的行所以他应该属于查找和扫描的混合体
range:只检索给定范围的行,使用一个索引 l来选择行,如where语句中出现了between,s,>,in等查询,这种范围扫描索引此全表扫描要好,因为它只需要开始于索引的某一点, 而结束于另一点,不用扫描全部索引。
index:扫描所有索引,这通常比A快,因为索引文件通常比数据文件小,index是从索引|中读取,all从硬盘中读取
all:全表扫描,是最差的一种查询类型
模糊查询与索引
模糊查询会影响到索引的类型
%在前有可能会导致索引失效
%在后就是代表有看你会出现的索引
例如下图:没有期望用到的索引,但是有实际用到的索引
下图是实际和期望都有相关的索引属性
模糊查询会导致索引失效,但其实使用的时候是有结果的