MySQL如何调优
1数据库设计三范式
2数据库分表分库——水平分割,垂直分割
3.定位慢查询
4.存储过程
不用where 分组用having
mysQL(免费,开源RDS)
MySQL如何实现优化
1数据库设计要合理(3F)
2.添加索引(普通索引,主键索引,唯一索引,全文索引)
3分表分库技术(取模分表,水平分割,垂直分割)
4.读写分离(读一个写一个减少IO量)
5存储过程
6配置MYSQL最大连接数(my.ini文件)
7.MySQL服务器升级
8.随时清理碎片化
9.SQL语句调优
数据库设计
1.减少冗余量
2.3F(三范式)
第一范式:1F 原子性 (每列不能再分)1NF是对属性的原子性约束,要求属性(列)具有原子性,不可再分解;(只要是关系型数据库都满足1NF)
id name sex address(地址是否能分看公司需求)
第二范式:2F 保证唯一 性 主键
2 分布式系统解决并发生成订单号
保证抢票中,订单号不会重复生成(怎么保证订单的幂等性(幂等=保证不会重复生成))
解决办法(提前把订单号生成好放在Redis中)
第三范式:3NF是对字段冗余性的约束,它要求字段没有冗余。 没有冗余的数据库设计可以做到。
但是,没有冗余的数据库未必是最好的数据库,有时为了提高运行效率,就必须降低范式标准,适当保留冗余数据。具体做法是: 在概念数据模型设计时遵守第三范式,降低范式标准的工作放到物理数据模型设计时考虑。降低范式就是增加字段,允许冗余。
ID name sex
下面做了一个简单的例子展示一下水平分割的取模算法
maven添加的依赖如下
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>mYSQLDesion</groupId>
<artifactId>ssss</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>ssss</name>
<description>mySQL QuMO shuanfa</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- <dependency>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-starter-jdbc</artifactId>-->
<!-- </dependency>-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
因为用的idea编辑器,选择web其实只用添加下面的maven
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
数据库设计四个表
一个user1 user2 user3 ,一个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;
application.properties代码如下
spring.datasource.url=jdbc:mysql://localhost:3306/testmysql?serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
service层
package mysqldesion.ssss.test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
@Service
public class UserService {
@Autowired
private JdbcTemplate jdbcTemplate;
//1取模算法的存放
public String regist(String name, String pwd) {
String insertUUIDSQl = "insert into uuid values (null)";
jdbcTemplate.update(insertUUIDSQl);
//查询到最近添加的id
Long userID = jdbcTemplate.queryForObject("select last_insert_id()", long.class);
//存放在具体表里面
String tableName = "user" + userID % 3;
// String insetsql = "insert into " + tableName + "values(" + userID + "," + name + "," + pwd + ")";
String inserUserSQL = "insert into " + tableName + " values(" + userID + "," + name + ",'" + pwd + "')";
System.out.println(inserUserSQL);
jdbcTemplate.update(inserUserSQL);
return "success";
}
//取模算法的查看
public String get(Long userid) {
String tableName = "user" + userid % 3;
// String SelectUSerSQL="select * from "+tableName+" where id="+userid+"";
String selectUserSQL = "select name from " + tableName + " where id =" + userid;
System.out.println(selectUserSQL);
String name= jdbcTemplate.queryForObject(selectUserSQL,String.class);
return name;
}
}
controller层
package mysqldesion.ssss.test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/regist")
public String regist(String name ,String pwd){
return userService.regist(name,pwd);
}
@RequestMapping("/get")
public String get(Long ueserid) {
return userService.get(ueserid);
}
}