视图是一种虚拟存在的表,对于使用视图的用户来说基本上是透明的。视图并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的。
-- 创建视图
-- 视图名字一般以v开头,为什么?主要是在查看的时候方便知道这个是视图,主要是起到见名之意
create view 视图名字 as select 语句
-- 查看视图
show tables;
-- 删除视图
drop view 视图表名字;
-- 城市表查询
select * from areas a inner join areas b on a.id=b.pid;
-- 当创建视图的时候报以下错误
create view view_city_gx as select * from areas a inner join areas b on a.id=b.pid;
ERROR 1060 (42S21): Duplicate column name 'id'
-- 主要是因为查询表中有两个id值,所以视图字段也是不可以重复
-- 取别名
create view view_city_gx as select a.*, b.name as cname from areas a inner join areas b on a.id=b.pid where a.name="广西";
有下列内容之一,视图都不能做修改
事务是InnoDB引擎特有的特征之一
所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位
我们现在知道事务时一个抽象的概念,它其实对应着一个或多个数据库操作,设置数据库的大神根据这些操作所执行的不同阶段把事务大致上划分成了这么几个状态:
表的引擎必须是InnoDB类型才可以使用事务,这是mysql表的默认引擎
begin;
start transaction;
commit;
rollback;
如果你开启一个事务,并且以已经敲了很多语句,忽然发现上一条语句有点问题,你只好使用rollback语句来让数据库状态恢复到事务执行之前的样子,然后一切从头再来,总有一种一夜回到解放前的感觉,所有设计数据库的大神们提出了一个保存点(英文:savepoint)的概念。,我们在调用rollback语句时可以指定会滚到哪个点,而不是最初的点。
savepoint 保存点名字
rollback to 保存点名字
release savepoint 保存点名字
隔离性其实比想象要复杂。在SQL中定义了四种隔离的级别,每一种隔离级别都规定了一个事务中的修改,哪些是在事务内和事务间是可见的,哪些是不可见的。较低级别的隔离通常来说能承受更高的并发,系统的开销也会更小。
查看当前的事务级别
SELECT @@tx_isolation;
set session transaction isolation level 隔离级别;
READ UNCOMMITTED(读未提交)
所有事务都可以看到其他未提交事务的执行结果,会产生脏读(读取未提交的数据
READ COMMITTED(读提交)
一个事务职能看见已经提交事务所做的改变,会产生不可重复读问题
REPEATABLE READ (可重读)
这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读
SERIALIZABLE(串行化)
这是最高的隔离级别,读取共享锁,写加排他锁,读写互斥,从而解决幻读问题。在这个级别。可能导致大量的超时现象和锁竞争
-- 方法一
show index from 表名;
-- 方法二
show index from 表名\G
create index 索引名称 on 表名(字段名称(长度))
创建一个测试表,使用python写入数据进行测试
use Job;
create table test(name varchar(30));
# -*- coding: utf-8 -*-
# Author : Small-J
# 2021/2/1 11:53 上午
import pymysql
class Test(object):
def __init__(self):
self.connect = pymysql.Connect(user='root', password='root', host='localhost', port=3306, database='Job')
self.cursor = self.connect.cursor()
def add_data(self):
for i in range(1000000):
self.cursor.execute("insert into test(name) values ('small-%s')" % i)
self.connect.commit()
self.cursor.close()
self.connect.close()
def run(self):
self.add_data()
if __name__ == '__main__':
t = Test()
t.run()
set profiling=1;
select * from test where name='small-100000';
show profiles
-- create index 索引的名称 on 表 (列名)
create index index_test_name on test(name varchar(30));
show profiles
总结:从图中可以看出创建索引是可以大大的缩短时间的
第二层服务层是MySQL的核心,MySQL的核心服务层都在这一层,查询解析,SQL执行计划分析,SQL执行计划优化,查询缓存。以及跨存储引擎的功能都在这一层实现:存储过程,触发器,视图等。通过下图来观察服务层的内部结构
show engines\G
myisampack -b -f myIsam.MYI
非事务型应用
只读类应用
对比项 | MyISAM | InnoDB |
---|---|---|
主外键 | 不支持 | 支持 |
事务 | 不支持 | 支持 |
行表锁 | 表锁,即使操作一条记录也会锁住整个表,不适合高并发的操作 | 行锁,操作时只锁某一行,不对其他行有影响。适合高并发的操作 |
缓存 | 只缓存索引,不缓存真实数据 | 对内存要求较高,而且内存大小对性能有决定性的影响 |
表空间 | 小 | 大 |
关注点 | 性能 | 事务 |
如果应用需要事务支持,那么InnoDB(或者XtraDB)是目前最稳定并且经过验证的选择
如果可以定期地关闭服务器来执行备份,那么备份的因素可以忽略。反之,如果需要在线热备份,那么选择InnoDB就是基本的要求
MyISAM崩溃后发生损坏的概率比InnoDB要高很多,而且恢复速度也要慢