mysql常见的数据库引擎和区别:
MyISAM:默认的MySQL插件式存储引擎,它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一。注意,通过更改STORAGE_ENGINE配置变量,能够方便地更改MySQL服务器的默认存储引擎。
InnoDB:用于事务处理应用程序,具有众多特性,包括ACID事务支持。(提供行级锁
BDB:可替代InnoDB的事务引擎,支持COMMIT、ROLLBACK和其他事务特性。
Memory:将所有数据保存在RAM中,在需要快速查找引用和其他类似数据的环境下,可提供极快的访问。
Merge:允许MySQL DBA或开发人员将一系列等同的MyISAM表以逻辑方式组合在一起,并作为1个对象引用它们。对于诸如数据仓储等VLDB环境十分适合。
Archive:为大量很少引用的历史、归档、或安全审计信息的存储和检索提供了完美的解决方案。
Federated:能够将多个分离的MySQL服务器链接起来,从多个物理服务器创建一个逻辑数据库。十分适合于分布式环境或数据集市环境。
Cluster/NDB:MySQL的簇式数据库引擎,尤其适合于具有高性能查找要求的应用程序,这类查找需求还要求具有最高的正常工作时间和可用性。
Other:其他存储引擎包括CSV(引用由逗号隔开的用作数据库表的文件),Blackhole(用于临时禁止对数据库的应用程序输入),以及Example引擎(可为快速创建定制的插件式存储引擎提供帮助)。
关系型数据库:Oracle、DB2、Microsoft SQL Server、Microsoft Access、MySQL等
:指采用了关系模型来组织数据的数据库。简单来说,关系模式就是二维表格模型。
优点 (1)容易理解,二维表的结构非常贴近现实世界,二维表格,容易理解。
(2)使用方便,通用的sql语句使得操作关系型数据库非常方便。
(3)易于维护,数据库的ACID属性,大大降低了数据冗余和数据不一致的概率。
非关系型数据库:NoSql、Cloudant、MongoDb、redis、HBase
优势:1. 性能NOSQL是基于键值对的,可以想象成表中的主键和值的对应关系,而且不需要经过SQL层的解析,所以性能非常高。
2. 可扩展性同样也是因为基于键值对,数据之间没有耦合性,所以非常容易水平扩展。
设置自增的起始值:
alter table tablename auto_increment = 0;
设置自增的步长:
mysql
基于会话级别:
show session variables like 'auto_inc%' 查看全局变量
set session auto_increment_increment = 2; 设置会话的步长
set session auto_increment_offset = 10; 设置起始值
全局级别:
show global variables like 'auto_inc%'
set global auto_increment_increment = 200;设置全局的步长
set global auto_increment_offset = 10;
外键的变种:
唯一索引
不等于:
select * from tb1 where id !=1;
select * from tb2 where id <> 1;
select * from tb2 where id in (1,5,12);
select * from tb2 where id not in (1,5,13);
select *from tb2 where id between 5 and 12;//取到的是闭区间
select * from tb2 where id in (select id from tb1);
select * from tb2 where name like "a%"
%表示多个字符 _是一个字符,%a%只要有a就行
select * from tb12 limit 10; //前几条
select * from tb2 limit 1,1 //起始位置,往后取几条数据
select * from tb2 limit 10 offset 20; //limit后是取几条,offfset从第几条取
排序:
select * from tb2 order by id desc(倒序)/asc(正序) limit 10; 取后10条数据
分组:
select * from tb2 group by id ;
sum max min avg count ;
having
连表操作:
select * from tb1 ,tb2 where tb1.id = tb2.id;
select * from tb1 left join tb2 on tb1.id = tb2.id;//左侧表全部显示
select * from tb1 right join tb2 on tb1.id = tb2.id;//右侧表全部显示即t b2
select * from tb1 inner join tb2 on tb1.id = tb2.id; //将出现null的一行隐藏
临时表:
select sid from (select * from score where num > 60) as B;
pymysql模块:
pip3 install pymysql
触发器: 当对某表的做增删改操作时,使用触发器自定义关联行为,
create triggr t1(视图名称) before insert on student(表名) for each row
begin
insert into teacher(tname) values('sdaas')
values值New.name 为插入时的值
Old.name 为插入,删除的值
end
修改终止符:delimiter //
delimiter ;
函数:
内置函数:
执行函数
时间格式化:
自定义函数:
存储过程:保存在mysql上的一个别名,一堆sql语句,调用别名进行使用
保存在数据库中
创建存储过程
delimiter //
CREATE PROCEDURE p1()
BEGIN
select * from student;
select * from teacher;
END
delimiter ;
执行存储过程
call p1()
方式一:
mysql:存储过程
程序:调用存储过程
方式二:
mysql:程序员
程序:sql语句
方式三:
mysql:程序员
ORM框架:类和对象
1、存储过程传参:(in ,out, inout)
create PROCEDURE p(
IN N1 int,
IN N2 INT)
BEGIN
select * from user where sid >N1;
END
2、参数out:
delimiter //
create PROCEDURE p2(
out n2 int,用于标识存储过程的执行结果
in n1 int)
begin
set n2 = 123123;
select * from student where sid >n1;
END //
delimiter ;
3、事务
索引:
作用:
约束
加速查找
索引:
普通索引(加速查找)
主键索引(加速查找,不能为空,不能重复)
唯一索引(加速查找,不能重复)
联合索引(联合唯一)(多列索引)
--联合主键索引
--联合唯一索引
--联合普通索引
加速查找:
快:
select * from tb where name = "asdf"
假设:
id name email
无索引:从前到后一次查找
索引:
id 创建额外文件(某种格式存储)
name email 创建额外文件(某种格式存储)
索引种类:
hash索引:
单值索引快
范围索引慢
BTree索引(常用):
原理:二叉树
建立索引
create index 索引名 on 表名(字段) -- 针对字段进行建立索引
drop index 索引名
缺点:额外的文件保存特殊的数据结构
查询快,插入更新删除慢
命中索引:
select * from user where email ="asdf"
普通索引(加速查找):
--create index 索引名 on 表名(字段) -- 针对字段进行建立索引
--drop index 索引名
唯一索引
--create unique index 索引名 on 表名(字段) -- 针对字段进行建立索引
--drop unique index 索引名
联合索引:(普通的索引)
--create index 索引名 on 表名(字段1,字段2) -- 针对字段进行建立索引
--drop index 索引名
索引名词补充:
覆盖索引:在创建的索引文件中直接将数据取到
select id from user where id = "111"
索引合并:把多个单列索引合并使用
select * from user where id="111" and email="aaa"
最左前缀匹配:需要
create index ix_name on user (id,name)
select * from user where id ="1" and name= "asdf"
组合索引效率 > 索引合并:把多个单列索引合并使用
--(name,id)
select * from user where name = "sss" and id ='11'
--name
--id
select * from user where id ="sss" and name= "ddfd"
频繁查找的列创建索引:
-创建索引
-命中索引
- like '%xx'
select * from tb1 where name like '%cn';
- 使用函数
select * from tb1 where reverse(name) = 'wupeiqi';
- or
select * from tb1 where nid = 1 or email = 'seven@live.com';
特别的:当or条件中有未建立索引的列才失效,以下会走索引
select * from tb1 where nid = 1 or name = 'seven';
select * from tb1 where nid = 1 or email = 'seven@live.com' and name = 'alex'
- 类型不一致
如果列是字符串类型,传入条件是必须用引号引起来,不然...
select * from tb1 where name = 999;
- !=
select * from tb1 where name != 'alex'
特别的:如果是主键,则还是会走索引
select * from tb1 where nid != 123
- >
select * from tb1 where name > 'alex'
特别的:如果是主键或索引是整数类型,则还是会走索引
select * from tb1 where nid > 123
select * from tb1 where num > 123
- order by
select email from tb1 order by name desc;
当根据索引排序时候,选择的映射如果不是索引,则不走索引
特别的:如果对主键排序,则还是走索引:
select * from tb1 order by nid desc;
- 组合索引最左前缀
如果组合索引为:(name,email)
name and email -- 使用索引
name -- 使用索引
email -- 不使用索引
3、时间
执行计划,让mysql预估执行操作
explain 预估:
快:select * from user where id ='2'
type:ref(索引扫描)
慢:select * from user where name = "alex"
type:all(全表扫描)
4、DBA工作
慢日志
-执行时间 > 10
-未命中索引
-日志路径
配置:
内存:
show variable like '%query%'
set global 变量名 = 值
配置文件
--mysql的配置文件
mysql --defaults-file ='D:\my.conf'
修改配置文件之后,需要重启服务
5、分页:
select * from user limit
翻的页越大,越慢,因为月在后面扫描的记录条数就越长,就越慢
解决方法一:索引表里面扫描
select * from user where id in (
select id from user limit 200,10)
方法二:select * from user where id >200 order by desc limit 10;
记录当前页的最大或者最小的id,
页面只有上一页下一页:
当一类函数公用同样的参数对象的时候,可以转变为类进行 --分类
面向对象:数据和逻辑(属性和行为)组合在一起
函数编程:数据和逻辑分离
ORM框架:SQLAlchemy
-作用
提供简单的规则
自动转化为sql语句
-DBfirst 手动建表
-Code first 手动创建类和数据库,通过orm框架,自动生成表
创建数据库
连接数据库
类转换sql语句
子查询:
--query(表名) :要查询的表名 ,filter是条件限制,filter()里面两个条件的话,是条件之间是and
# 条件
ret = session.query(Users).filter_by(name='alex').all()
ret = session.query(Users).filter(Users.id > 1, Users.name == 'eric').all()
ret = session.query(Users).filter(Users.id.between(1, 3), Users.name == 'eric').all()
--
ret = session.query(Users).filter(Users.id.in_([1,3,4])).all() -- 加下划线 这条语句的在user.id是1 3 4 中查询
ret = session.query(Users).filter(~Users.id.in_([1,3,4])).all() -- ~非(not)的意思 这条语句的在user.id是1 3 4 中查询
--filter_by : 内部子查询 的限制条件
ret = session.query(Users).filter(Users.id.in_(session.query(Users.id).filter_by(name='eric'))).all()
from sqlalchemy import and_, or_
--引入and_,or_
ret = session.query(Users).filter(and_(Users.id > 3, Users.name == 'eric')).all()
ret = session.query(Users).filter(or_(Users.id < 2, Users.name == 'eric')).all()
ret = session.query(Users).filter(
or_(
Users.id < 2,
and_(Users.name == 'eric', Users.id > 3),
Users.extra != ""
)).all()
# 通配符
ret = session.query(Users).filter(Users.name.like('e%')).all()
ret = session.query(Users).filter(~Users.name.like('e%')).all()
# 限制(分页,直接切片)
ret = session.query(Users)[1:2]
# 排序
--order_by desc ,asc
ret = session.query(Users).order_by(Users.name.desc()).all()
ret = session.query(Users).order_by(Users.name.desc(), Users.id.asc()).all()
# 分组(group_by)
from sqlalchemy.sql import func
ret = session.query(Users).group_by(Users.extra).all()
ret = session.query(
func.max(Users.id),
func.sum(Users.id),
func.min(Users.id)).group_by(Users.name).all()
ret = session.query(
func.max(Users.id),
func.sum(Users.id),
func.min(Users.id)).group_by(Users.name).having(func.min(Users.id) >2).all()
--having 根据分组之后,进行二次筛选
# 连表
--query要查的两个表
ret = session.query(Users, Favor).filter(Users.id == Favor.nid).all()
ret = session.query(Person).join(Favor).all() --默认为inner_join
ret = session.query(Person).join(Favor, isouter=True).all() --未outer join
# 组合
q1 = session.query(Users.name).filter(Users.id > 2)
q2 = session.query(Favor.caption).filter(Favor.nid < 2)
ret = q1.union(q2).all() #去重
q1 = session.query(Users.name).filter(Users.id > 2)
q2 = session.query(Favor.caption).filter(Favor.nid < 2)
ret = q1.union_all(q2).all() #不去重
#临时表
--select * from (select * from A) as B
q1 = session.query(Users.name).filter(Users.id > 2).subquery()
ret = session.query(q1).all()
print(ret)