1、数据表 collect ( id, title ,info ,vtype) 就这4个字段,其中 title 用定长,info 用text, id 是逐渐,vtype是tinyint,vtype是索引。这是一个基本的新闻系统的简单模型。现在往里面填充数据,填充10万篇新闻。
2、最后collect 为 10万条记录,数据库表占用硬盘1.6G。OK ,看下面这条sql语句:select id,title from collect limit 1000,10很快;基本上0.01秒就OK,再看下面的select id,title from collect limit 90000,10从9万条开始分页。
3、8-9秒完成。
4、看下面一条语句:select id from collect order by id limit 90000,10很快,0.04秒就OK。因为用了id主键做索引当然快。
“mysql”达到1亿级别如何设计优化?
1.首先可以考虑业务层面优化,即垂直分表。
垂直分表就是把一个数据量很大的表,可以按某个字段的属性或使用频繁程度分类,拆分为多个表。
如有多种业务类型,每种业务类型入不同的表,table1,table2,table3.
如果日常业务不需要使用所有数据,可以按时间分表,比如说月表。每个表只存一个月记录。
2.架构上的优化,即水平分表。
水平分表就是根据一列或多列数据的值把数据行放到多个独立的表里,这里不具备业务意义。
如按照id分表,末尾是0-9的数据分别插入到10个表里面。
可能你要问,这样看起来和刚才说的垂直分表没什么区别。只不过是否具备业务意义的差异,都是按字段的值来分表。
实际上,水平分表现在最流行的实现方式,是通过水平分库来实现的。即刚才所说的10个表,分布在10个mysql数据库上。这样可以通过多个低配置主机整合起来,实现高性能。
最常见的解决方案是cobar,这个帖子介绍的比较完善,可以看看。
1、设计数据库表
先设计一个数据库表,用于保存用户信息,建表语句如下:
CREATE TABLE
tbl_user_info
(
id INT NOT NULL AUTO_INCREMENT,
user_name VARCHAR(20) NOT NULL,
age INT NOT NULL,
sex INT(1) NOT NULL,
create_dt DATE NOT NULL,
PRIMARY KEY (id)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8
在用户表中定义了几个字段,分别是id,user_name,age,sex,create_dt,其中id是主键,是自增长的,user_name表示用户名,age表示用户年龄,sex表示用户的性别,这里的性别用数字表示,0表示女性,1表示男性,create_dt表示创建的时间。预先在数据库中插入几条数据,数据如下。
2、定义实体类
定义一个Bean,与数据库表中的各个字段对应:
package com.imooc.jdbc
import java.uTIl.Date
public class UserVO {
private int id
private String userName
private int age
private int sex
private Date createDt
public int geTId() {
return id
}
public void seTId(int id) {
this.id = id
}
public String getUserName() {
return userName
}
public void setUserName(String userName) {
this.userName = userName
}
public int getAge() {
return age
}
public void setAge(int age) {
this.age = age
}
public int getSex() {
return sex
}
public void setSex(int sex) {
this.sex = sex
}
public Date getCreateDt() {
return createDt
}
public void setCreateDt(Date createDt) {
this.createDt = createDt
}
@Override
public String toString() {
return “UserVO [id=” + id + “, userName=” + userName + “, age=” + age
+ “, sex=” + sex + “, createDt=” + createDt + “]”
}
}
3、定义数据库连接类
定义一个数据库连接类,用于获取MySQL的连接
package com.imooc.jdbc
import java.sql.ConnecTIon
import java.sql.DriverManager
public class DBUtil {
private static final String URI = “jdbc:mysql://192.168.2.207:3306/jdbc_demo?”
+ “user=root&password=root&useUnicode=true&characterEncoding=UTF-8”
private static final String DRIVER = “com.mysql.jdbc.Driver”
public static Connection connectDB() throws Exception {
//1、加载数据库驱动
Class.forName(DRIVER)
//2、获取数据库连接
Connection conn = DriverManager.getConnection(URI)
return conn
}
}
MySQL的JDBC URL编写方式为:jdbc:mysql://主机名称:连接端口/数据库的名称?参数=值,在这个例子中我连接的数据库主机是一台远程主机,所以主机名称为远程主机的ip地址,如果数据库主机为本机,则可以定义为localhost,在参数中指定用户名为root,密码也是root,为了避免中文乱码要指定useUnicode和characterEncoding。因为连接的是MySQL数据库,所以程序一开始需要加载MySQL的数据库驱动,然后通过DriverManager.getConnection(String URL)方法获取数据库的连接。
4、实现数据库的增删改查
在获取了数据库的连接之后,就可以 *** 作数据库了,下面分别实现数据库的增删改查 *** 作,定义一个UserDao类用于 *** 作数据库。
1)查询
先看查询 *** 作,查询可以一次查询出所有的数据,也可以根据相应的条件查询。
查询所有的数据,在UserDao中定义一个queryAll()方法:
public List<UserVO>queryAll() throws Exception {
Connection conn = DBUtil.connectDB()
String sql = “SELECT * FROM tbl_user_info”
List<UserVO>userList = new ArrayList<UserVO>()
Statement stmt = conn.createStatement()
ResultSet rs = stmt.executeQuery(sql)
while(rs.next()) {
UserVO user = new UserVO()
user.setId(rs.getInt(“id”))
user.setUserName(rs.getString(“user_name”))
user.setAge(rs.getInt(“age”))
user.setSex(rs.getInt(“sex”))
user.setCreateDt(rs.getDate(“create_dt”))
userList.add(user)
}
return userList
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)