- 数据库引擎及区别
innodb:执行行级锁和表级锁和事务(要成功都成功,要失败都失败)
myisam:速度更快,支持全文索引,一般不会用,会另外做全文搜索引擎。 - 事务特性
原子,持久,一致 - 数据锁
mysql中怎么给数据加的锁:
直接select是没有锁的,开启事务时才加的锁,释放锁用commit
begin
select * from xxx for update
commit
如
用户1:
用户2:
用户2等在这了,等用户1commit后就能运行。如何直接写select 没有影响。
如果查询整个表数据,整个表都锁上了,
如果查询一条数据,只锁定一条数据。
应用场景:
crm 当一个用户申请客户时,别人申请不了,
sql语句
- 分组group by 分组后having
- join 联表
left join 左连接,全称:left outer join如果谁在前谁就是主表,主表的数据全都会展示,另外一个是连接表,
inner join 把空值的行删掉,如果没有空值和left join 一样
right join 以右边的为主表,
如
- 索引
作用:
约束,加速查找
约束:
主键
唯一
联合唯一
加速查找:
建立目录,通过索引快速找到数据
数据表存在硬盘,如果对某列创建索引,会再硬盘上对这列另外创建一个数据结构(文件)存这列的索引数据,索引怎样加速查找呢?
如果要查某个表的某一列,不到这个表去查,因为会比较多的数据,使用索引查(where name = ‘Lau’),直接定位到‘Lau’这个硬盘位置取出数据,如果没有索引,就全表扫描,从第一行开始找,效率比较低。所以数据量大,索引优势更明显。数据表是没行每行存的,索引是按特殊数据结构存储的,
毕加树存储结构
如把name这列创建索引,把所有name变成数字,按数字大小堆放到文件中,name = ’Lau’ Lau变成了数字,在索引中查,
这个表存的是地址,根据地址拿到数据,数据查找十分快。2的32次方4294967196,最多有这么多数据,最差32次就找到了
成本:物理存储的成本占硬盘,更新成本(删除,增加,修改)
哈希索引
把数据库变成字典,速度块,代价key不能重复。
所以一般数据迁移从一个服务器导出脚本时,把索引文件剔除调,到下一个数据库时,数据生成后,再统一加索引 - 索引种类
主键:非空,不重复,单列
唯一:不重复,可以一个为空,单列
普通:单列
联合主键:多列
联合唯一索引:多列
联合索引:多列
覆盖索引:不是真实的索引,无须去物理表中,再索引表中拿到想要的数据
索引合并:多列索引,多个单列索引,用户名和密码联合索引。一个索引文件。用户做个索引,密码做个索引。两个索引文件,多个单列索引去查找数据,叫索引合并 - 联合索引想要命中索引应遵循:最左前缀原则
name,email,pwd --》做一个联合索引,必须遵循从最左边开始,通过name,通过name,email,通过name,email,pwd,通过name, pwd都可以,不可以:email,或email,pwd - 存储过程:数据分析,dba,orical需要写存储过程。
- 触发器
- 视图
- 程序如何抗高并发(数据库的优化的方式)
对于开发的代码可以通过多进程或多线程完成,但如果请求来很多
数据库支持的并发不够
对数据库进行读写分离
所有发来的请求都去数据库操作,加入读可以支持3000并发量,写支持6000并发量,程序卡在读上了,可以多安装一台服务器,装一模一样的数据库,通过配置两者直接的通信,保证数据一致。一个读,一个写。请求基本上读取多写少,一个承载3000读,一个承载3000读,并写。可以同时承载6000并发,不够可以加数据库
方式二:
分库分表
数据库进行划分,一个数据库表越多,管理的数据越来越多,同时找他的人越多,速度比较满,这个数据库1000张表,分5个数据库,每个数据库200张表。
分表:针对特别大的那张表,如查账单时展示最近三个月,历史跳到另外一页查,默认查时显示近三个月的那种表,另外页面跳到另外一个表,也叫垂直分表
水平分表:列如果很多,常用的是3列,onetoone,查询速度快
方式三:
使用单表(数据冗余),提供查询速度。提高并发
foreignkey
硬盘存的数量比较少,节省硬盘,利于选择。
单表查询速度比联表查询速度块,牺牲硬盘,提升用户感受。数据冗余。
-方式四:
缓存
redis
对于数据库经常查的数据,不放数据库,再买台服务器,内存较大,放热点数据库中的数据到内存,查询速度十分快。实时性不好,但速度很快。
博客园,增加完标签后,刷新主要看不到增加的标签,数据库有,5分钟缓存数据失效,去数据库把数据放到缓存,给用户一份,下一次再刷新就可以看到了,优势:提高用户访问,劣势:实时性没办法保证。提高效率:修改时就更新缓存。
程序抗并发
负载均衡
缓存区并发较多,再创建一个缓存 - 数据库优化
索引加速查找:创建并命中索引
固定长度往前放
name age phone:依据:习惯
name:变长,age:固定长度,phone:固定长度
age,phone放前面,
数据库是放在一个物理表的,
常见且不修改的数据放内存:
Django的choices 男,女 ,存内存,联表查询时比较慢,
数据库存数字1 2
少些select *,把一行数据拿到,网络通讯把数据发过来,还不用,
用哪列写哪列,
创建索引并命中索引 - char和varchar的区别
char定长的字符,char(50)-----> 50个字符
varchar 变长