1. 数据库三范式
  2. 数据库分表分库
  3. 怎样定位慢查询
  4. 索引优化
  5. sql语句的调优
  6. 数据库读写分析
  7. 配置mysql最大连接数 my.ini
  8. mysql服务器升级
  9. 随时清理mysql碎片
  10. 基础:分组 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日志可定位慢查询语句