数据库
--------------------------------------------------------------------------------------------
一、MySql存储过程示例:
CREATE PROCEDURE p_name()
begin
DECLARE fetchOk boolean;##跳出游标标识
DECLARE var_osid VARCHAR (40);
DECLARE var_osbaseday VARCHAR (40);
DECLARE orderlist CURSOR FOR
SELECT o1.id,o1.baseServiced_day from t_order o,t_ordercs1 o1 WHERE o.id=o1.id;
declare continue handler for NOT FOUND set fetchOk = true;##fetchSeqOk为true跳出游标
set fetchOk = false;
OPEN orderlist;
orderlist:LOOP
FETCH orderlist into var_osid,var_osbaseday;
if fetchOk then
leave orderlist;
else
update t_order s set s.baseServiced_day=var_osbaseday WHERE s.id=var_osid;
end if;
END LOOP;
close orderlist;
end
--------------------------------------------------------------------------------------------
二、MySql索引:
1、四种索引:primary(主键)、normal(普通)、unique(唯一)、fulltext(全文)
1)primary(主键索引):索引列唯一,不能为空,一张表只有一个主键索引(通常建表时候指定),示例如下:
create table t_user(id int not null,username varchar(16) not null,parimary key(id))
2)normal(普通索引):索引列没有任何限制,示例如下:
create table t_user(in int not null,username varchar(16) not null,index username_index(username(16)))(创建时指定)
alter table t_user add index u_indx(username)(修改表添加)
drop index u_index on t_user(删除索引)
3)unique(唯一索引):索引列值必须唯一,但是允许有空
create table t_user(id int not null,username varchar(16) not null,unique u_index(username))(创建表时指定)
alter table t_user add unique u_index(username)(alter指定)
drop index u_index on t_user(删除索引)
4)fulltext(全文搜索索引):搜索很长一篇文章的时候,效果最好。
--------------------------------------------------------------------------------------------
三、组合索引(复合索引):多个列加入到统一个索引中。
1、创建索引:
alter table t_user add index name_city_phone(username,city,phone)//组合普通索引
alter table t_user add unique name_city_phone(username,city,phone)//组合唯一索引
其实相当于建了(username,city,phone;username,city;username,phone)三个索引。
2、最左前缀:where条件中第一个一定是最左边的索引。下面的都会走索引
1)SELECT * FROM t_user where USERNAME="parry" and CITY="广州" and PHONE="180"
2)SELECT * FROM t_user where USERNAME="parry" and CITY="广州"
3)SELECT * FROM t_user where USERNAME="parry" and PHONE="180"
--------------------------------------------------------------------------------------------
四、SQL优化:
1、不走索引情况:
1)有null值不走索引,组合索引中有一列含有null值就不走索引。
2)like '%aa%' 不会走索引,like 'aa%' 会走索引,like左边别加%
3)not in 、!=、<> 不会走索引,使用<、<=、=、>、>=、between、in、exists代替
4)or不走索引,用union代替
5)where中有函数不走索引
2、使用短索引:
1)alter table t_user add index u_index(username(16)) 优于 alter table t_user add index u_index(username)
--------------------------------------------------------------------------------------------
五、btree索引与hash索引
1、MySql默认是btree索引,Innodb也支持hash索引,需要配置启用
2、hash索引不用自己建立,数据库自己维护,hash索引只支持 '=' 'in'等值查询
--------------------------------------------------------------------------------------------
六、MySql性能优化:
max_connections 默认200 建议配置1000,允许最大16384
wait_timeout 空闲连接默认时长,超过就关闭
back_log=500 连接达到max_connections时 堆栈中可以存储的连接数
thread_concurrency=64 应设置为cpu核数的2倍
max_allowed_packet=64M mysql服务器接收的数据包的最大值
--------------------------------------------------------------------------------------------
七、MySql主从复制:
配置主机:
指定主机配置文件/etc/my.cnf中server-id唯一;开启配置log_bin;指定需要复制的数据库;不需要复制的数据库;二进制过期天数;重启数据库
配置从机:
指定从机配置文件中server-id唯一,不开启log_bin;设置super_read_only=1;重启数据库
从机连接主机:
从机上操作change master to 指定主机IP、用户名、密码、端口、当前二进制文件、文件的起始位置等。
确定从机是否成功连上主机:show slave \G;如果Slave_IO_Running;Slave_SQL_Running都是YES,说明成功。从机执行start slave后,一般是YES;从机不能写,read_only=1针对普通用户,super_read_only=1也针对root用户
主从同步延迟:
主库按DDL和DML顺序产生binlog,效率高,从库的Slave_IO_Running线程取到主库的日志,在从库实施,DML和DDL的IO操作是随机的,不是顺序的,成本高;slave查询产生lock竞争,Slave_SQL_Runnning是单线程的,一个DDL卡住了,其他DDL会等它执行完。master的DDL可以并发,而slave的Slave_SQL_Running不可以并发。还有网络延迟原因。硬件原因,从库的硬件差等。主库并发高,产生的DDL数量超过slave一个sql线程能承受的范围,或者slave大型query产生锁。
同步延迟解决方案:
主库DDL快速执行,事务要小;从库的硬件要好与主库;配置方面,从库的安全性不需要很高,关闭所有日志相关的参数
--------------------------------------------------------------------------------------------
八、分库分表:
分库分表基础知识:
MySql单表容量1千万以下状态最佳,MySql默认使用B+树索引,单表1千万数据,索引树高3到5,数据量越大,索引性能越低。
分表类型:垂直分表;水平分表
垂直分表:把一个表的多个字段拆分到多个表中,每个表都包含主键字段,一般冷字段一个表,热字段一个 表,垂直分表不常用
水平分表:一个表分成多个表,每个表包含所有字段,只是里面的数据不一样。
水平分表规则:Hash取模分表;数值Range分表等
Hash取模分表:根据主键id对表的数量取余数,分表存在不同的表
数值Range分表:给主键id分配区间,如1-10000存一个表,10001-20000存一个表。。。
分库分表问题:
分库的话需要解决分布式事务,使用shardingsphere,既能解决分布式事务,又能解决分库分表主从。引入sharding-jdbc的starter和namespace这两个依赖,配置文件中配置主库、从库、分库分表规则、读写分离等。比如指定根据表的某一字段值分库、再根据另一个字段值分表,一般根据id,对数据库数量取余,对库中表的数量取余。sql中写tablea,数据库中建表tablea0、tablea1、tablea2。shardingsphere支持基本查询、分页、group等,join性能差,不支持having union all。springboot整合了jta-atomikos,也支持分布式事务,亲测有效。用起来不如shardingsphere好用,写很多配置相关的代码,shardingsphere封装的比较好。
--------------------------------------------------------------------------------------------