day08 索引的创建与慢查询优化
day08 索引的创建与慢查询优化
昨日内容回顾
视图
视图:将SQL语句查询结果实体化保存起来,方便下次查询使用。
	视图里面的数据来源于原表,视图只有表结构
# 创建视图
create view 视图名称 as sql语句;
# 视图使用频率不高
触发器
对表执行增、改、删操作前后可以自动触发的功能
# 创建触发器
create trigger 触发器名称 before/after insert/delete/update on 表名
from each row
begin
	sql语句
end
# 针对触发器名字要做到见名知意
	tri_after_insert_m1
# 临时修改SQL语句结束符
	delimiter $$
存储过程
可以看成python里面的自定义函数
create procedure m1()
call m1() # 调用
# 在pymysql模块也可以调用存储过程
	cursor.call_proc('村年初过程名字',参数)
事务
事务四大特性:ACID
	原子性:要么同时成功,要么同时失败。
	一致性:事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
	隔离性:事务和事务之间互不干扰。
	持久性:一个事务一旦提交,它对数据库中数据的改变就应该是永久性。
# 开启事务
	start transaction;
# 回滚
	rollback;
# 确认事务
	commit;
函数
# 函数相当于python中的内置函数
可以利用help查看一些函数的用法
1、移除指定字符
Trim、LTrim、RTrim
2、大小写转换
Lower、Upper
3、获取左右起始指定个数字符
Left、Right
4、返回读音相似值(对英文效果)
Soundex
5、日期格式:date_format
流程控制
# if判断
if i = 1 THEN
       SELECT 1;
ELSEIF i = 2 THEN
       SELECT 2;
ELSE
       SELECT 7;
END IF;
# while循环
SET num = 0 ;
WHILE num < 10 DO
    SELECT
        num ;
    SET num = num + 1 ;
END WHILE ;
索引的分类
1、primary key
	主键索引:可以加快查询速度,还有额外的约束条件
2、unique key
	唯一键:可以加快查询速度,还有额外的约束条件
3、index key
	普通索引:只能加快查询速度,没有其他额外的功能
今日内容
- 如何操作索引
- 如何判断当前SQL语句是否走了索引
- 脏读、幻读、不可重复等理论
如何操作索引
# 查看当前表内部索引值
	show index from m1;
# 删除索引
	alter table m1 drop index 索引名(ind_name、uni_pwd)
	alter table m1 drop index ind_name;
1、主键索引:
	alter table m1 add primary key pri_id(id);
2、唯一键索引:
	alter table m1 add unique key uni_pwd(pwd);
	# 添加唯一键索引的前提是:保证数据没有重复。不然会报错。
	# 怎样判断有重复的数据:
		思路一:可以使用group by分组pwd,然后在使用count计数。
			select name,count(pwd) from m1 group by pwd;
		思路二:可以利用去重来判断是否有重复数据
			select count(pwd) from m1;  # 3
			select count(distinct pwd) from m1;  # 2,去重之前是3,之后是3
3、普通索引:
	alter table m1 add index ind_name(name);
	3.1、前缀索引(属于普通索引):根据字段的前N个字符建立索引
		# 什么时候使用前缀索引?
			避免对大列(数据多的列)建索引,如果有使用前缀索引。
			eg:搜过博客、百度等
		alter table m1 add index ind_name(name(10));  # 把姓名前10个字符做成索引
	3.2、联合索引:多个字段建立一个索引
		# 最左使用原则:把最常用来做条件查询的列放在最前面
			eg:相亲平台,搜索心意对象时候
		alter table m1 add index idx_all(gender,age,money);  # 把多个字段名建成一个索引
		例子:
			where a.女生 and b.年龄 and c.身家
			index(a,b,c)
			特点:前缀生成特效
			a,ab,ac    # 可以走索引或者部分走索引
			b,bc,c,ca  # 不走索引
explain句式(慢查询优化)
1、全表索引:在explain语句结果中type为ALL
	不走索引、一行行查找数据、效率极其低下,生产环境下尽量不要书写类似的SQL
2、索引扫描:在explain语句结果中type不为ALL
	走索引,加快数据查询,建议书写该类型SQL
3、explain:就是帮助我们查看SQL语句属于哪种扫描
    查找:
        explain select * from m1 where id=1;  # 级别:const,走索引扫描
        explain select * from student;  # type;ALL,不建议使用这种  优化:limit 1;
4、常见的索引扫描:优化到级别到range就好
	1) index
	2) range
	3) ref
	4) eg_ref
	5) const
	6) system
	7) null
	# 从上到下,性能从最差到最好,我们认为至少要达到range级别。
5、不会走索引的情况:
	1) 没有查询条件,或者查询条件没有建议索引
	2) 查询结果集超过原表中的大部分数据(25%以上),不会走索引  # limit 控制下
	3) 索引本身失效,统计数据不真实
	4) 查询条件使用函数在索引列上或者对索引进行运算,运算包括(+,-,*,/)
	5) 隐式转行导致索引失效
		# 字段是字符类型,查询使用整形
		create table m1(id int,name varchar(32),telnum varchar(32))  # telnul类型是字符
		insert into m1 values(1,'hh,'110'),(2,'dd',220);
		alter table m1 add index idx_tel(telnum);  # 建立普通查询
		explain select * from m1 where telnum=120; # 查询级别为ALL,telnul类型是字符
		explain select * from m1 where telnum='120'; # 查询级别为ref,telnul类型是字符
	6) <> ,not in不走索引
        单独的>,<,in 有可能走,也有可能不走,和结果集有关,尽量结合业务添加limit、or或in尽量改成union
	7)like "%_"百分号在最前面不走
		like '%100' : 不走索引
		like '100%' :走索引
	8)单独引用联合索引里非第一位置的索引列不走 # 最左匹配原则
# 索引的创建会加快数据的查询速度,但是一定程度会拖慢数据的插入和删除速度
# 重点:2、5、7、8
隔离级别
在SQL标准中定义了四种隔离级别,每一种级别都规定了一个事务中所做的修改。
InnoDB支持所有隔离级别
	set transaction isolation level 级别
1.read uncommitted(未提交读)
	事务中的修改即使没有提交,对其他事务也都是可见的,其他事务可以读取未提交的数据,这一现象也称之为"脏读"  # 读的是修改了但是没有提交的数据称之为脏读。
2.read committed(提交读)   # InnoDB默认支持
	大多数数据库系统默认的隔离级别
  一个事务从开始直到提交之前所作的任何修改对其他事务都是不可见的,这种级别也叫做"不可重复读"
3.repeatable read(可重复读)		# MySQL默认隔离级别
	能够解决"脏读"问题,但是无法解决"幻读"
  所谓幻读指的是当某个事务在读取某个范围内的记录时另外一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围的记录会产生幻行,InnoDB和XtraDB通过多版本并发控制(MVCC)及间隙锁策略解决该问题
4.serializable(可串行读)
	强制事务串行执行,很少使用该级别
参考文献:https://www.cnblogs.com/Dominic-Ji/p/15560680.html
day08 索引的创建与慢查询优化的更多相关文章
- Mysql中索引的 创建,查看,删除,修改
		创建索引 MySQL创建索引的语法如下: ? 1 2 3 CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name [USING index_type] ON ... 
- MySQL索引的创建、删除和查看
		MySQL索引的创建.删除和查看 此文转自http://blogold.chinaunix.net/u3/93470/showart_2001536.html 1.索引作用 在索引列上,除了上面提到的 ... 
- MySQL索引的创建,查看,删除
		在执行CREATE TABLE语句时可以创建索引,也可以单独用CREATE INDEX或ALTER TABLE来为表增加索引. 1.ALTER TABLE ALTER TABLE用来创建普通索引.UN ... 
- Oracle中如何导出存储过程、函数、包和触发器的定义语句?如何导出表的结构?如何导出索引的创建语句?
		Oracle中如何导出存储过程.函数.包和触发器的定义语句?如何导出表的结构?如何导出索引的创建语句? QQ群里有人问:如何导出一个用户下的存储过程? 麦苗答:方法有多种,可以使用DBMS_MET ... 
- oracle 索引的创建与使用
		什么是数据库索引 在关系数据库中,索引是一种与表有关的数据库结构,它可以使对应于表的SQL语句执行得更快. 索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容. 对于数据库来说,索引是 ... 
- MongoDB索引管理-索引的创建、查看、删除
		索引是提高查询查询效率最有效的手段.索引是一种特殊的数据结构,索引以易于遍历的形式存储了数据的部分内容(如:一个特定的字段或一组字段值),索引会按一定规则对存储值进行排序,而且索引的存储位置在内存中, ... 
- oracle中查询用户表/索引/视图创建语句
		不多说,直接上干货 1.查询当前用户下表的创建语句 select dbms_metadata.get_ddl('TABLE','ux_future') from dual; 2.查询其他用户下表的创建 ... 
- 【SqlServer】SqlServer索引的创建、查看、删除
		索引加快检索表中数据的方法,它对数据表中一个或者多个列的值进行结构排序,是数据库中一个非常有用的对象. 索引的创建 #1使用企业管理器创建 启动企业管理器--选择数据库------选在要创建索引的表- ... 
- JAVAEE——Lucene基础:什么是全文检索、Lucene实现全文检索的流程、配置开发环境、索引库创建与管理
		1. 学习计划 第一天:Lucene的基础知识 1.案例分析:什么是全文检索,如何实现全文检索 2.Lucene实现全文检索的流程 a) 创建索引 b) 查询索引 3.配置开发环境 4.创建索引库 5 ... 
随机推荐
- poj 1704 Georgia and Bob (nim)
			题意: N个棋子,位置分别是p[1]...p[N]. Georgia和Bob轮流,每人每次可选择其中一个棋子向左移动若干个位置(不能超过前一个棋子,不能超出最左边[位置1]且不能不移) Georgia ... 
- 面试官:能用JS写一个发布订阅模式吗?
			目录 1 场景引入 2 代码优化 2.1 解决增加粉丝问题 2.2 解决添加作品问题 3 观察者模式 4 经纪人登场 5 发布订阅模式 6 观察者模式和发布订阅模式的对比 什么是发布订阅模式?能手写实 ... 
- Qt Creator 常用快捷键 详细总结
			下面是我总结的一些Qt Creator 常用快捷键 ,可以大大提高我们使用Qt开发项目的效率!! Qt Creator 常用快捷键 快捷键 介绍 F1 查看帮助文档 Shift + F2 函数的声明和 ... 
- PCB各层介绍
			在PCB设计中用得比较多的图层: mechanical 机械层 keepout layer 禁止布线层 Signal layer 信号层 Internal plane layer 内部电源/接地层 t ... 
- Flask搭建弹幕视频网站(1)
			说在前面 也不知道最后能不能完成网站,所以就想把这十多天来学习到的点点滴滴记录下来.学的越来越多,所谓全栈也是需要前端基础,越来越感受到压力,但是遇到一个问题就解决一个问题,慢慢习惯之后感觉也还行.说 ... 
- 深入理解Spring IOC源码分析
			Spring容器初始化 本文使用的是Spring 5.1.7版本 写在前面:我们看源码一般有3种方式. 第一种直接用class文件,IDEA会帮我们反编译成看得懂的java代码 第二种是用maven的 ... 
- Python如何格式化输出
			目录 Python中的格式化输出 1.旧格式化 2.新格式format( ) 函数 Python中的格式化输出 格式化输出就是将字符串中的某些内容替换掉再输出就是格式化输出 旧格式化输出常用的有%d( ... 
- 单线程 Redis 为什么这么快,看看这篇就知道了
			Redis 作为一种 KV 缓存服务器,有着极高的性能,相对于 Memcache,Redis 支持更多种数据类型,因此在业界应用广泛. 记得刚毕业那会参加面试,面试官会问我 Redis 为什么快,由于 ... 
- 千呼万唤,web人脸识别登录完整版来了,这样式我爱了
			大家好,我是小富~ 在我最开始写文章的时候曾经写过一篇文章 基于 Java 实现的人脸识别功能,因为刚开始码字不知道写点什么,就简单弄了个人脸识别的Demo. 但让我没想到的是,在过去的一年里有好多好 ... 
- go语言并发编程
			引言 说到go语言最厉害的是什么就不得不提到并发,并发是什么?,与并发相关的并行又是什么? 并发:同一时间段内执行多个任务 并行:同一时刻执行多个任务 进程.线程与协程 进程: 进程是具有一定独立功能 ... 
