day07 MySQL索引事务
day07 MySQL索引事务
昨日内容回顾
pymysql模块
# 链接数据库都是使用这个模块的
# 创建链接
import pymysql
conn = pymysql.connect(
host='127.0.0.1',
port=3306,
user='root',
password='123',
database='db1',
charset='utf8',
autocommit=True
)
# 生成一个游标对象
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
sql注入问题
sql注入问题:利用特殊符号的组合产生具有一定特殊含义的数据从而避免常规逻辑
核心就是敏感型数据不要自己去做拼接
# execute方法可以帮SQL语句移除特殊符号的影响
execute(sql,(%s,%s)) # 拼接username,password
今日内容概要
- 视图
- 触发器
- 流程控制
- 内置函数
- 事务(重点记)
- 索引
- 二叉树
- b树
- b+树
- b*树
- 慢查询优化(explain语句)
视图view
# 优点:
将SQL语句的查询结果当做虚拟表实体化保存下来,以后可以反复使用
# 缺点:
1.只能当做查询使用,不能修删改。因为虚拟表自己是没有表数据的,数据是查询原表的
2.虽然视图没有表数据文件,但是也有一个表结构文件。建太多也会占内存。
3.在cmd中查看表,虚拟表看起来和普通表一样,但是当修改时候容易混淆。
# 格式:
create view 视图名 as SQL语句
mysql> create view s1 as select * from course inner join teacher on course.teacher_id=teacher.tid;
触发器trigger
触发器:在满足对某张表数据的增、删、改的情况下,自动触发的功能称之为触发器
1、触发器:满足特定条件之后自动执行
在MySQL只有三种情况下触发
1.针对表的增
# 增前、增后:会触发条件执行
2.针对表的改
# 改前、改后:会触发条件执行
3.针对表的删
# 删前、删后:会触发条件执行
2、为什么用触发器
触发器专门针对我们对某一张表数据进行增insert、删delete、改update的行为,这类行为一旦执行,
就会触发触发器的执行,即自动运行另外一段SQL代码
3、语法结构
create trigger 触发器的名字 before/after insert/update/delete on 表名 for each row
begin
sql语句
end
# 想要使用触发器的前提是把结束符换掉
# 触发器名字在命名的时候推荐使用下列的方式
tri_after_insert_t1、tri_before_delete_t1 # 见名知意:在对t1表插入之前触发,t1表删除之后触发
# 如何临时修改SQL语句的结束符(使用触发器的前提换掉结束符)
delimiter $$ # 以前结束符是 ;
# 在MySQL中NEW特指数据对象可以通过点的方式获取字段对应的数据
id name pwd hobby
1 jason 123 read
NEW.name >>> jason
4、案例
1.创建表
CREATE TABLE cmd (
id INT PRIMARY KEY auto_increment,
USER CHAR (32),
priv CHAR (10),
cmd CHAR (64),
sub_time datetime, #提交时间
success enum ('yes', 'no') #0代表执行失败
);
2.创建错误日志表
CREATE TABLE errlog (
id INT PRIMARY KEY auto_increment,
err_cmd CHAR (64),
err_time datetime
);
3.创建触发器(模板)
delimiter $$ # 将mysql默认的结束符由;换成$$
create trigger tri_after_insert_cmd after insert on cmd for each row
begin
if NEW.success = 'no' then # 新记录都会被MySQL封装成NEW对象
insert into errlog(err_cmd,err_time) values(NEW.cmd,NEW.sub_time);
end if;
end $$
delimiter ; # 结束之后记得再改回来,不然后面结束符就都是$$了
4.往表cmd中插入记录,触发触发器,根据IF的条件决定是否插入错误日志
INSERT INTO cmd (
USER,
priv,
cmd,
sub_time,
success
)
VALUES
('tony','0755','ls -l /etc',NOW(),'yes'),
('tony','0755','cat /etc/passwd',NOW(),'no'),
('tony','0755','useradd xxx',NOW(),'no'),
('tony','0755','ps aux',NOW(),'yes');
# 查询errlog表记录
select * from errlog;
# 查看触发器
show triggers; # \G:会格式化
# 删除触发器
drop trigger tri_after_insert_cmd;
事务
事务四大特性(ACID)
A:原子性
每个事务都是不可分割的最小单位(同一个事务内的多个操作要么是同时成功,要么同时失败)
C:一致性
事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
I:隔离性
事务与事务之间彼此互不干扰。 # 高并发时候会出现
D:持久性
一个事务一旦提交,它对数据库中数据的改变就应该是永久性。
# 开启事务
start transaction;
# 回滚到上一个状态
rollback;
# 确认事务
commit;
# 事务在没有确认之前,数据是保存在内存中临时修改下,一旦确认了会保存在硬盘中并且回滚不了。
存储过程
存储过程:类似于python中的自定义函数。用过调用它的名字可以执行其内部的SQL语句。
用法:
1.查看存储过程具体信息
show create procedure p2;
2.查看所有存储过程
show procedure status;
3.删除存储过程
drop procedure p2;
1、无参存储过程
delimiter $$
create procedure p1()
begin
select * from user;
end $$
delimiter ;
# 调用
call p1()
2、有参存储过程
1.创建存储过程(模板)
delimiter $$
create procedure p2(
in m int, # in表示这个参数必须只能是传入不能被返回出去
in n int,
out res int # out表示这个参数可以被返回出去,还有一个inout表示即可以传入也可以被返回出去
)
begin
select * from teacher where tid > m and tid < n;
set res=0; # 用来标志存储过程是否执行
end $$
delimiter ;
2.针对res需要提前定义
set @res=10; 定义
select @res; 查看
call p2(1,5,@res); 调用
3.代码操作存储过程
import pymysql
conn = pymysql.connect(
host='127.0.0.1',
port=3306,
user='root',
passwd='123',
db='db6',
charset='utf8',
autocommit=True
)
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
cursor.callproc('p2',(1,3,10)) # 存储过程
# @_p1_0=1,@_p1_1=3,@_p1_2=10;
print(cursor.fetchall())
函数
# 相当于Python中的内置函数
函数和存储过程的区别:MySQL内置函数只能在SQL语句中使用
'''可以通过hele 函数名,查看帮助信息'''
1、移除指定字符
Trim、LTrim、RTrim
2、大小写转换
Lower、Upper
3、获取左右起始指定个数字符
Left、Right
4、返回读音相似值(对英文效果)
Soundex
"""
eg:客户表中有一个顾客登记的用户名为J.Lee
但如果这是输入错误真名其实叫J.Lie,可以使用soundex匹配发音类似的
where Soundex(name)=Soundex('J.Lie')
"""
5、日期格式:date_format
'''在MySQL中表示时间格式尽量采用2022-11-11形式'''
CREATE TABLE blog (
id INT PRIMARY KEY auto_increment,
NAME CHAR (32),
sub_time datetime
);
INSERT INTO blog (NAME, sub_time)
VALUES
('第1篇','2015-03-01 11:31:21'),
('第2篇','2015-03-11 16:31:21'),
('第3篇','2016-07-01 10:21:31'),
('第4篇','2016-07-22 09:23:21'),
('第5篇','2016-07-23 10:11:11'),
('第6篇','2016-07-25 11:21:31'),
('第7篇','2017-03-01 15:33:21'),
('第8篇','2017-03-01 17:32:21'),
('第9篇','2017-03-01 18:31:21');
案例:把这些文章按照年月分组
select date_format(sub_time,'%Y-%m'),count(id) from blog group by date_format(sub_time,'%Y-%m');
1.where Date(sub_time) = '2015-03-01'
2.where Year(sub_time)=2016 AND Month(sub_time)=07;
# 更多日期处理相关函数
adddate 增加一个日期
addtime 增加一个时间
datediff计算两个日期差值
...
流程控制
# 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、算法:解决事务的办法
入门级算法:二分法
二分法的前提:数据集必须是有序的
nums = [-3, 5, 7, 11, 21, 31, 41, 53, 67, 77, 83, 99, 101]
def search(nums,find_num):
print(nums)
if len(nums) == 0:
print('不存在')
return
mid_index = len(nums) // 2
if find_num > nums[mid_index]:
# 在右半部分
search(nums[mid_index+1:],find_num)
elif find_num < nums[mid_index]:
# 在左半部分
search(nums[:mid_index],find_num)
else:
print('找到了')
# search(nums,67)
search(nums,69)
# 二分法理论:在数据中间切一半对比,判断69在哪一半里,在切一半判断一直找到这个数为止。
2、数据结构
二叉树:(只能分两个叉)
b树 b+树(叶子节点添加了指针) b*树(枝节点也添加了指针)
# 添加指针是为了加快范围查询的速度
# 精准查找:使用b树,范围查找:b+树
将某个字段添加成索引就相当于依据该字段建立了一颗b+树从而加快查询速度
如果某个字段没有添加索引 那么依据该字段查询数据会非常的慢(一行行查找)
# 结论:查询速度特别慢,应该建索引。 name age 之类的
B+tree索引
索引的分类
1、primary key
主键索引:除了有加速查询的效果外,还具有一定的约束条件
2、unique key
唯一键索引:除了有加速查询的效果外,还具有一定的约束条件
3、index key
普通索引:只有加速查询的效果,没有额外约束条件
数据库设计三大范式
什么是范式:
为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就称为范式。
第一范式(确保每列都保持原子型)
第一范式是最基本的范式。如果数据库表中的所有字段之都是不可分解的原子值吗,就说明该数据库表满足了第一范式。
第二范式(确保表中的每列都和主键相关)
第二范式在第一范式的基础之上更进一层。第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关。
第三范式(确保每列都和主键列直接相关,而不是间接相关)
第三范式需要确保数据表中的每一列数据都和主键直接相关,而不是间接相关。
day07 MySQL索引事务的更多相关文章
- mysql数据库 索引 事务和事务回滚
mysql索引 索引相当于书的目录优点:加快数据的查询速度缺点:占物理存储空间,添加,删除,会减慢写的速度 查看表使用的索引 mysql> show index from 表名\G;(\G分行显 ...
- mysql数据库 事务和索引
1.MySQL数据库特性: 原子性(atomidity) 一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一 ...
- 【面试】MySQL的事务和索引
MySQL事务 MySQL事务主要用于处理操作量大,复杂度高的数据. 比如说,在人员管理系统中,你删除一个人员,你既需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这些数据库操作 ...
- MySQL索引与事务
MySQL索引与事务 链接:https://pan.baidu.com/s/1ANGg3Kd_28BzQrA5ya17fQ 提取码:ekpy 复制这段内容后打开百度网盘手机App,操作更方便哦 1.索 ...
- MySQL索引、事务、存储引擎
一.MySQL 索引 1.索引的概念 ●索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址(类似于C语言的链表通过指针指向数据记录的内存地址).●使用索引后可以不用扫描 ...
- MySQL 索引、事务与存储引擎
MySQL 索引.事务与存储引擎 1.索引 2.事务 3.存储引擎 1.索引: 索引的概念 : 索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址 ...
- 27.MySQL 索引、事务与存储引擎
MySQL 索引.事务与存储引擎 目录 MySQL 索引.事务与存储引擎 MySQL 索引 索引的概念 索引的作用及副作用 索引的作用 索引的副作用 创建索引的原则依据 索引的分类和创建 普通索引 唯 ...
- 一天五道Java面试题----第七天(mysql索引结构,各自的优劣--------->事务的基本特性和隔离级别)
这里是参考B站上的大佬做的面试题笔记.大家也可以去看视频讲解!!! 文章目录 1 .mysql索引结构,各自的优劣 2 .索引的设计原则 3 .mysql锁的类型有哪些 4 .mysql执行计划怎么看 ...
- MYSQL索引结构原理、性能分析与优化
[转]MYSQL索引结构原理.性能分析与优化 第一部分:基础知识 索引 官方介绍索引是帮助MySQL高效获取数据的数据结构.笔者理解索引相当于一本书的目录,通过目录就知道要的资料在哪里, 不用一页一页 ...
随机推荐
- Python matplotlib pylot和pylab的区别
matplotlib是Python中强大的绘图库. matplotlib下pyplot和pylab均可以绘图. 具体来说两者的区别 pyplot 方便快速绘制matplotlib通过pyplot模块提 ...
- Ubuntu 16.04 下 旋转显示器屏幕 竖屏显示
xrandr -o left $ xrandr -o left 向左旋转90度 $ xrandr -o right 向右旋转90度 $ xrandr -o inverted 上下翻转 $ xrandr ...
- populating-next-right-pointers-in-each-node leetcode C++
Given a binary tree struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *nex ...
- hdu 5172 GTY's gay friends(线段树最值)
题意: GTY有n个朋友,站成一排,每个人有一个特征值ai. 有m个询问.每次询问给两个数L,R.问你[L,R](即aL...aR)是否是1..(R-L+1)的一个全排列. 是输出YES,否则输出NO ...
- 第10课 OpenGL 3D世界
加载3D世界,并在其中漫游: 在这一课中,你将学会如何加载3D世界,并在3D世界中漫游.这一课使用第一课的代码,当然在课程说明中我只介绍改变了代码. 这一课是由Lionel Brits (βtelge ...
- Spring Cloud Alibaba环境搭建
前言:Spring Cloud Alibaba是目前主流的分布式微服务架构,本文主要讲解了在IDEA中如何搭建Spring Cloud Alibaba环境,以及介绍Spring Cloud Aliba ...
- 并发编程从零开始(十四)-Executors工具类
并发编程从零开始(十四)-Executors工具类 12 Executors工具类 concurrent包提供了Executors工具类,利用它可以创建各种不同类型的线程池 12.1 四种对比 单线程 ...
- 集合之Map接口
Map接口概述 Map与Collection并列存在.用于存储具有映射关系的数据 : key-value Map 中的 key 和 value 都可以是任何引用类型的数据 Map 中的 key 用Se ...
- CSS 脉冲和火箭动画特效
CSS脉冲和火箭动画特效 <!DOCTYPE html> <html lang="en"> <head> <meta charset=
- 【JAVA】笔记(1)---JVM内存图;方法重载条件;输入方法;转义字符;强制类型转换;变量分类及区别;Java命名规范;
Java命名规范: 1.包:全部字母小写: 2.类+接口:所有单词的首字母大写: 3.变量+方法:第一个单词的首字母小写,其余单词首字母大写: 3.常量名:所有字母均大写,且用下划线" _ ...