操作索引脏读、幻读、不可重复读 python复习

操作索引脏读、幻读、不可重复读 

 

视图

把sql语句查询结果保存下来,结果就叫视图
	视图的数据来自于原始表,在硬盘中只有表结构
create view 视图名称 as SQL语句;

触发器

对表执行增、删改操作后自动触发的功能,类似于crontab
create trigger 触发器名称 before/after insert/delete/update on 表名
for each row
begin
	SQL语句
end

# 触发器名字
	tri_after_insert_t1
   触发器_之前/之后_插入/修改/删除_表名
# 临时修改SQL语句结束符 记得用完再改回来
	delimiter $$

存储过程

也可以叫做python里面的自定义函数
create procedure p1(in m int,out n int) ...      #in 传入    out:传出    inout:可以传入也可以传出
call p1(1,2)
# 在pymysql模块中也可以调用存储过程
	cursor.call_proc('存储过程名字',参数)

事务

ACID
	原子性 :每个事务都是不可分割的最小单位,同一个事务内的多个操作 要么同时成功,要么同时失败
    一致性:事务从一个一致性状态变为另一个一致性状态
    隔离性:事务与事务之间彼此互不打扰,事务彼此之间都是独立的 也叫独立性
    持久性:一个事务一旦提交,他对数据库的改变应该是是永久的
start transaction;  # 开启事务
rollback  # 回滚  回滚之后这个事务就结束了
commit  # 确认   确认了这个事务就结束了

函数

#只能在sql语句中使用 不能单独调用  

类似于python的内置函数
# 1.移除指定字符
Trim、LTrim、RTrim

# 2.大小写转换
Lower、Upper
# 3.获取左右起始指定个数字符
Left、Right

	Soundex  根据发音相近的
    date_format('时间字段','时间格式')
    date()
    year()
    month()
#按照年月分组
Y  m  d  H  M  S     X
年 月 日 时 分 秒     时分秒

select date_format(sub_time,'%Y-%m'),count(id) from blog group by date_format(sub_time,'%Y-%m');

流程控制

# if判断
if  条件 then
	子代码;
    #不满足条件会执行下面的
elseif 条件1 then
	子代码;
else #上面都不满足
	子代码
 endif

# while循环

while 条件 do
	满足执行这个;
    改变条件;
end while    




索引

什么是索引
	索引就是为了加快数据的查询速度 
    在计算机底层的表现形式就是一些数据结构()
数据结构:
    二叉树
    b树    枝节点和叶子节点没有指针
    b+树   叶子节点添加了指针
    b*树   枝节点添加了指针(叶子节点也有)
"""
指针的添加主要是为了简介范围查询问题
	精确查找取决于树的高度
"""
    我们在查询数据的时候如果使用的条件创建了索引则可以加速查询
    如果没有创建索引则无法使用加速查询的功能
#索引的分类
1.primary key
	除了可以加快查询之外 还有额外的约束条件
2.unique key
	除了可以加快查询之外 还有额外的约束条件
3.index key
	只能加快数据查询 没有其他额外的功能

 

如何操作索引

SQL语句控制索引的添加 删除 查询

怎么判断当前sql语句是否走了索引

优化SQL语句

脏读、幻读、不可重复读等理论

简单的理论

python复习

 

  1. 如何操作索引

    #创建唯一索引需要提前排查是否有重复数据
      select count(字段) from t1         #先查询这列多少内容
      select count(distinct(字段)) from t1  #在去重查询 
    #查看表内部索引值
    	show index from 表名;
    #添加索引之 
    	主键索引                              #起名字要见名知意
            alter table 表名 add primary key pri_id(id);  
        唯一索引							#起名字要见名知意
            alter table 表名 add unique key uni_age(age)
        普通索引							#起名字要见名知意
            alter table 表名 add index idx_name(name)
       前缀索引(属于普通索引) #根据字段前n个字符建立索引
       #什么时候会用到前缀索引    某个字段很多数据 需要他做成索引 可以使用前缀索引
    	避免对大列建索引,如果有就使用前缀索引
        	eg:博客内容 百度搜索内容等
    	alter table t1 add index idx_name(name(4))   #里面的数字表示把前几个字符做成索引
    联合索引(属于普通索引)
    	    相亲平台 搜索心仪对象的时候   多个选项
        	# 遵循最左匹配原则 最左面的是最常用的,会把最左面的看得最重
        	gender money height beautiful 
    	alter table t1 add index idx_all(name,age,sex)
    #删除索引
    	alter table t1 drop index 索引名
    
  2. 怎么判断当前sql语句是否走了索引(explain句式)

    #只需要写在要执行的sql语句前面  比如 explain selecr * from user where id =1;
    全表扫描
    	不走索引 一行行查找数据 效率极低 生产环境下尽量不要书写类似SQL
    索引扫描
    	走索引 加快数据查询 建议书写该类型SQL
    
    explain就是帮助我们查看SQL语句属于那种扫描
    # 常见的索引扫描类型:   查看type这个里面内容 只要不是all就表示走了索引扫描  但是index和all差别不大 
        1)index
        2)range
        3)ref
        4)eq_ref
        5)const
        6)system
        7)null
    从上到下,性能从最差到最好,我们认为至少要达到range级别 range 级别往上任意就ok
    # 不走索引情况(起码记忆四条及以上)
    	1.没有查询条件,或者查询条件没有建立索引
        2.查询结果集是原表中的大部分数据(25%以上) #查询结果的数据是原表中%25以上数据 即使使用了索引 他也不会走索引  ,可以用limit控制一下
        3.索引本身失效,统计数据不真实
        4.查询条件使用函数在索引列上或者对索引列进行运算,运算包括(+,-,*等) #比如where id-1等等
        5.隐式转换导致索引失效
        	#:字段创建是字符类型 查询使用整型 不走索引  创建字段用的什么类型 查询就要用什么类型 
        6.<> ,not in 不走索引
        	单独的>,<,in 有可能走,也有可能不走,和结果集有关,尽量结合业务添加limit、or或in尽量改成union
        7.like "%_" 百分号在最前面不走
        8.单独引用联合索引里非第一位置的索引列#最左匹配原则  第一个不匹配 就不匹配了 比如 用name age sex 做联合索引     查询时候 用age sex 那么不走索引  如果想走索引需要name开始
     
    """
    索引的创建会加快数据的查询速度 但是一定程度会拖慢数据的插入和删除速度
    """
    
  3. 脏读、幻读、不可重复读等理论

在SQL标准中定义了四种隔离级别,每一种级别都规定了一个事务中所做的修改
InnoDB支持所有隔离级别
	set transaction isolation level 级别

1.read uncommitted(未提交读)  #隔离级别是未提交读才会发生脏读
	事务中的修改即使没有提交,对其他事务也都是可见的,事务可以读取未提交的数据,这一现象也称之为"脏读"
    #transaction 事务开启后 不执行 commit 其他事务是可见的 
2.read committed(提交读)  #innodb 默认级别
	大多数数据库系统默认的隔离级别
  一个事务从开始直到提交之前所作的任何修改对其他事务都是不可见的,这种级别也叫做"不可重复读"
3.repeatable read(可重复读)		# MySQL默认隔离级别
	能够解决"脏读"问题,但是无法解决"幻读"
   # 幻读,并不是说两次读取获取的结果集不同,幻读侧重的方面是某一次的 select 操作得到的结果所表征的数据状态无法支撑后续的业务操作。更为具体一些:select 某记录是否存在,不存在,准备插入此记录,但执行 insert 时发现此记录已存在,无法插入,此时就发生了幻读。
  所谓幻读指的是当某个事务在读取某个范围内的记录时另外一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围的记录会产生幻行,InnoDB和XtraDB通过多版本并发控制(MVCC)及间隙锁策略解决该问题
4.serializable(可串行读)
	强制事务串行执行,很少使用该级别 #解决脏读 幻读 不可重复读 但是执行效率太低 不使用

python复习

#什么是编程
	程序员将自己的思维逻辑和写法用计算机能识别的语言写下来的过程就叫做编程
    编程的结果是产生一堆文件
#变量
	name='zhang'
# 基本数据类型
	整型int
    	age = 18
    浮点型float
    	salary = 3.1
    字符串str
    	name = 'jason'  # 引号引起来的部分
    列表list
    	'''
    	中括号括起来 内部存放多个元素 
    	元素与元素之间逗号隔开 元素可以是任意数据类型
    	'''
    	l = [111, 222, 333]
    字典dict
    	"""
    	大括号括起来 内部存放多个元素 元素是k:v键值对
    		k是v的描述性性质的信息 一般是字符串 不可变类型
    		v是真正的数据 相当于变量值 可以是任意数据类型
    	"""
    	d = {'name':"jason",'pwd':123}
    布尔值bool
    	True False
        False:0 None '' {} []...
    元组tuple
    	"""
    	小括号括起来 内部存放多个元素 
    	元素与元素之间逗号隔开 元素可以是任意数据类型
    	元组内索引指向的元素内存地址无法修改
    	"""
    	t = (111,222,333)
    集合set
    	"""
    	大括号括起来 内部存放多个元素 元素与元素之间逗号隔开
    	元素只能是不可变类型
    	"""
    	se = {1,2,3,4,5,6}
#内置方法

	int() float() str()
字符类型内置方法
    len(字符串名称) 
    strip()
    #strip,lstrip,rstrip  去除首尾符号或者什么的 replace可以实现一样操作 不过replace更多用于替换
        msg='      hello world      '
        print(msg.strip())# strip移除字符串首尾指定的字符(默认移除空格)
    #还有一个replace 
        print(msg.replace(' ',''))#第一个值写的是要被换掉的名称比如空格等,第二个表示换成什么
        #还可以有第三个参数 表示换几个 换几个空格 可以不是空格
	#split()
    	msg = "egon:18:male:10"   
	    res = msg.split(':')   #表示通过:把字符串分割成一块一块的成一个列表
    #lower() upper() islower() isupper()
    小写      大写     是否小写     是否大写
list列表内置方法
	.append()  尾部追加元素
    .insert(0,'值')  #指定位置插入元素  前面是索引 后面是值 如果插入的索引有值,原来的值会往后一位 新的值代替原来的值的位置 
    .extend()  扩展列表,也可以说一次性在列表尾部添加多个元素
    .remove()  指定移除列表内的元素 括号指定value值
    .pop()     按照索引弹出元素 默认删除最后一个
    .sort()    排序
dict字典内置方法
    .get()  按照key取值 key不存在默认返回None(不报错)
    .keys()    #获取所有key
    .values()   #获取所有value
    .items()   #获取所有key和value
    .pop  #通过指定字典的key来删除字典的键值对
# 流程控制
	if判断
    	if 条件1:
            条件1成立之后执行的子代码
        elif 条件2:
            条件1不成立条件2成立执行的子代码
        else:
            上述条件都成立的情况下执行的子代码
    while循环
    	while 条件:
            条件成立之后执行的循环体代码
        continuebreak
    for循环
		for 变量名 in 可迭代对象:  # 字符串 列表 字典 ...
            for循环子代码
# 文件操作
	with open(文件路径,模式,encoding) as 变量名:
        子代码
    1.转义 r'C:\a\n'
    2.模式
    	读写模式 
            r (默认):只读模式
            w 只写
            a 只写(追加写)新写的内容加到旧的内容后面
        操作模式 
            t (默认):无论读写都是以字符串为单位的,必须指定encoding参数(编码)
            b 无论读写都是以bytes为单位也就是二进制,不需要指定encoding参数,需要指定deconding(解码)  比如操作图片 视频等
    3.encoding用于指定编码 并不是必须的参数
   	'''针对文件内容的读取 采用for循环迭代读取'''
# 函数
	def 函数名(参数1,参数2):
        """函数注释"""
        函数体代码
        return 返回值
# 函数的参数
	位置参数 关键字参数 默认参数 可变长参数(*args **kwargs)
    """
    特殊符号*与**有两个应用场景
    	1.在函数的形参中
    		用于接收多余的位置和关键字参数分别组织成元组和字典赋值给后面的变量名
    		*赋值成元组      **赋值成字典
        2.在函数的实参中
        	*会将列表和元组内的元素打散成位置参数一一传入 
        	**会将字典打散成关键字参数传入 **后只能跟字典
    """
#装饰器
    在不改变被装饰对象"源代码"以及"调用方式"的基础之上添加新的功能
def outter(func):
    def inner(*args,**kwargs):
        print("我是之前")
        res=func(*args,**kwargs)         #调用原来的index 并获取返回值
        print("我是之后")
        return res   #index返回值
    return inner


@outter #等同于 index=outter(index)  返回inner的内存地址 赋值给index
def index(): #相当于调用inner
    print("im a index >>>>")


index()
#函数的递归
	函数在运行期间直接或者间接调用自己
    	递归
        	递推
            回溯
# 三元表达式 
	print( 'ok' if x>y else 'no'  ) # 三元指的是 成立返回结果,,条件   不成立返回结果
#匿名函数
    lamada 传入得值 :return的值 
	print (max(数据名,key=lamada k: 数据名[k] ))
    
#模块
	pip3 install 模块名
    import 模块名
    模块名.方法
    from ... import 模块名
    
    os模块、sys模块、time模块、json模块
#软件目录开发规范
    ATM里面的文件夹划分以及名称
    bin 执行文件  不是必须有
    conf 配置文件  一堆变量
    core  核心代码  被导入模块 ,一些功能
    lib   自定义仓库 自定义模块
    logs  日志
    db    注册的账号密码等,可有可无 数据库
    rademe   说明手册 说明书
                # src.py 编写程序地方
                #核心代码

开发目录规范
在这里插入图片描述

 

posted @ 2021-11-18 11:44  迪迦张  阅读(57)  评论(0编辑  收藏  举报