mysql memcache redis_mysql+redis+memcached

数据库

数据库设计

48304ba5e6f9fe08f3fa1abda7d326ab.png

a. 单表

b. FK(单表;一张表存储时,如果有重复出现的字段为了防止硬盘的浪费,所以做一个FK;去掉FK变成单表(这样子访问速度快了))

c. M2M(多对多关系)

到底是什么关系?

单选的下拉框/radio FK;多选下拉框/checkbox M2M

48304ba5e6f9fe08f3fa1abda7d326ab.png

举个小例子:

48304ba5e6f9fe08f3fa1abda7d326ab.png

问题:员工信息表员工当前薪资;保留员工的所有的调薪记录。

思路一:两张表

员工表:

id name salary

调薪:

id price time 员工ID

思路二:三张表

员工表:

id name salary

调薪:

id price time

员工调薪表:

id uid sid

48304ba5e6f9fe08f3fa1abda7d326ab.png

基本SQL

分组(group by)

select depart_id,count(1),max(salary),min(age),sum(age) fromuser group by depart_id

select depart_id,count(1),max(salary),min(age),sum(age) from user group by depart_id having count(1)>5

注意事项:

通过聚合条件group by然后进行筛选的用having不能用where

连表

inner join / left join /right join

inner join是保留两个共有的,如果一个没有就不保留。

left join 是以左表为主表,如果右表没数据,则为null

right join 是以右表为主表,如果左表没数据,则为null

举个小例子:

48304ba5e6f9fe08f3fa1abda7d326ab.png

数据:

部门表:

id title1销售2运营3IT

用户表:

id name 部门id

1 x1 1

2 x2 1

3 x3 1

4 x4 1

5 x5 1

48304ba5e6f9fe08f3fa1abda7d326ab.png

48304ba5e6f9fe08f3fa1abda7d326ab.png

请问查到多少条数据?

select* from userinfo left join depart on userinfo.did = depart.id 5select * from depart left join userinfo on userinfo.did = depart.id 7

select * from userinfo inner join depart on userinfo.did = depart.id 5

select * from depart inner join userinfo on userinfo.did = depart.id 5

48304ba5e6f9fe08f3fa1abda7d326ab.png

MySQL数据库引擎以及区别?

48304ba5e6f9fe08f3fa1abda7d326ab.png

a. 常见innodb、mysiam

b. 区别:-innodb:-支持事务(特性:原子性、一致性、隔离性、持久性)

事务就是(要完成都完成,要不完成就回滚)-表锁-行锁-mysiam-不支持事务-表锁-全文索引- 速度快

48304ba5e6f9fe08f3fa1abda7d326ab.png

48304ba5e6f9fe08f3fa1abda7d326ab.png

补充:

原生SQL

begin;

select * from xxx for update;

update ...

commit;

django:

with trancation.automic:

User.objects.filter().select_for_update()

48304ba5e6f9fe08f3fa1abda7d326ab.png

应用场景:商品数据计数。

索引

48304ba5e6f9fe08f3fa1abda7d326ab.png

作用:-加速查找-约束

种类:-索引:随便写- 唯一索引:允许Null +不重复- 主键索引:不允许Null +不重复

- 联合索引:多列组成一个索引

- 联合唯一索引:多列组成一个索引 + 唯一

例如:

name email pwd

命中索引遵循最左前缀的原则: name、name email、name pwd、name email pw

48304ba5e6f9fe08f3fa1abda7d326ab.png

48304ba5e6f9fe08f3fa1abda7d326ab.png

补充:-覆盖索引,当查找数据时候在索引表中就可以获取数据,无需去数据表中查找。

select namefrom user where name='xxx'

-索引合并, 使用多个单列索引进行查找。

select* from user where name='xx' email='xx'为什么索引快?

因为在索引结构中讲述按照B+来进行存放的数据。

48304ba5e6f9fe08f3fa1abda7d326ab.png

优化数据库方案

48304ba5e6f9fe08f3fa1abda7d326ab.png

a. 索引。

b. 固定长度的字段写在前面。

id name age

c. 对于固定选择的内容:性别,可以将其对应关系保存在内存中。

d. 分表-垂直分分,将数据分割到N张表。-水平分分,将列分到到N种表。

e. 分库

f. 读写分离(主从复制)

主:读写

从:读

在django中的应用:

models.Users.objects.filter(id=2).using('default')

models.Users.objects.filter(id=2).using('db1')

g. limit

select * from tb where name='alex' limit 1;

h. 缓存

将常用数据读取到redis中(缓存),读取速度快。

48304ba5e6f9fe08f3fa1abda7d326ab.png

char和varchar的区别。

char是定长,不变的。

varchar是变长,可变的。

视图、触发器、存储过程、函数

视图:视图是虚拟表或逻辑表,它被定义为具有连接的SQL SELECT查询语句。因为数据库视图与数据库表类似,它由行和列组成,因此可以根据数据库表查询数据。其内容由查询定义。

但是,视图并不在数据库中以存储的数据值集形式存在,行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。简单的来说视图是由其定义结果组成的表;

触发器:触发器,是一个表数据的变更后通过触发器来修改与之相关联的其他表的数据,保证数据的一致性。使用触发器可以定制用户对表进行【增、删、改】操作时前后的行为,注意:没有查询

存储过程是存储在数据库目录中的一坨的声明性SQL语句。

Java,Python,PHP等应用程序可以调用存储过程。

mysql自定义函数就是实现程序员需要sql逻辑处理,参数是IN参数,含有RETURNS字句用来指定函数的返回类型,而且函数体必须包含一个RETURN value语句。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值