- 数据库三范式
- 数据库分表分库
- 怎样定位慢查询
- 索引优化
- sql语句的调优
- 数据库读写分析
- 配置mysql最大连接数 my.ini
- mysql服务器升级
- 随时清理mysql碎片
- 基础:分组 having 存储过程,触发器,函数
三范式
数据库设计(减少冗余量、3F)
1F 原子约束 列不可再分
2F 要求数据库表中的每个实例或行必须可以被惟一地区分 及完全依赖于主键
3F 消除传递依赖(消除冗余数据)
分表分库
分库场景:服务拆分。每个服务对应不同的数据库,互不干扰。
分表场景:水平分割分表:业务场景 存放日志 根据年份分表
水平分割取模算法:总数据与表的数量取模
分表缺点:分页查询,查询受限制(可建视图)注意:主表存放所有数据,根据具体业务进行分表查询
创建三张表 user0 / user1 /user2 , 然后我再创建 uuid表,该表的作用就是提供自增的id。
create table user0(
id int unsigned primary key ,
name varchar(32) not null default '',
pwd varchar(32) not null default '')
engine=myisam charset utf8;
create table user1(
id int unsigned primary key ,
name varchar(32) not null default '',
pwd varchar(32) not null default '')
engine=myisam charset utf8;
create table user2(
id int unsigned primary key ,
name varchar(32) not null default '',
pwd varchar(32) not null default '')
engine=myisam charset utf8;
create table uuid(
id int unsigned primary key auto_increment)engine=myisam charset utf8;
用户注册与查询Service
@Service
public class UserService {
@Autowired
private JdbcTemplate jdbcTemplate;
public String register(String name, String password) {
String uuidSql = "insert into uuid values (null)";
jdbcTemplate.update(uuidSql);
Long id = jdbcTemplate.queryForObject("SELECT LAST_INSERT_ID()", Long.class);
//取模算法
String tableName = "user" + id % 3;
String insertSql = "INSERT INTO " + tableName + " VALUES ('" + id + "','" + name + "','" + password
+ "');";
System.out.println("insertUserSql:" + insertSql);
jdbcTemplate.update(insertSql);
return "success";
}
public String get(Long id) {
String tableName = "user" + id % 3;
String sql = "select name from " + tableName + " where id="+id;
System.out.println("SQL:" + sql);
String name = jdbcTemplate.queryForObject(sql, String.class);
return name;
}
}
[引用]
1. 水平分割:主表 + N个辅助表(辅助表由主表水平分割而成:按量分割,达到量(N万条)加辅助表)
2. 主表记录所有数据, 用于普通增删改和 普通 非模糊查询,加索引;
3. 辅助表 用于 模糊查询 (思路:查询所有分表,limit 前x条 , 然后汇总到新的 数组,重新排序分页)
4. 主表和N个辅助表 之间 可用 触发器 来同步数据
如何定位到慢查询
mysql默认慢查询为10秒(一般超过1s就考虑慢查询)
使用show status使用show status查看MySQL服务器状态信息
常用命令
--mysql数据库启动了多少时间 show status like 'uptime'; |
show stauts like 'com_select' show stauts like 'com_insert' ...类推 update delete(显示数据库的查询,更新,添加,删除的次数) |
show [session|global] status like .... 如果你不写 [session|global] 默认是session 会话,指取出当前窗口的执行,如果你想看所有(从mysql 启动到现在,则应该 global) |
//显示到mysql数据库的连接数 show status like 'connections '; |
//显示慢查询次数 show status like 'slow_queries'; |
查询慢查询时间
show variables like 'long_query_time';
修改慢查询时间
但是重启mysql之后,long_query_time依然是my.ini中的值
Mysql安全模式启动+查看mysql日志可定位慢查询语句