面对亿级数据,MySQL硬的起来么?

举报
小白同学111 发表于 2022/12/27 21:24:44 2022/12/27
【摘要】 面对亿级数据,MySQL硬的起来么?

很多粉丝问我:**MySQL到底能支撑多少数据,是不是500万以上就不行了,查询就非常慢了?**

这个问题问得好。到底行不行呢?

我觉得还是得通过实验来见证一下,mysql面对百万、千万、亿级别的数据时,查询到底行不行???

# **1亿数据查询速度**

# **创建表test1**

test1表,结构比较简单,2个字段,都有索引。

```
DROP TABLE IF EXISTS test1;CREATE TABLE test1(  id int PRIMARY KEY COMMENT '编号' auto_increment,  order_num bigint comment '订单号')COMMENT '用户表';/*order_num分别加索引*/create index idx1 on test1(order_num);
```

# **插入1亿数据**

```
@Testpublic void test1() throws SQLException, ClassNotFoundException {    Class.forName("com.mysql.jdbc.Driver");    Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/testdb?characterEncoding=UTF-8",            "root",            "密码");    StringBuilder sql = new StringBuilder("insert into test1(order_num) values ");    for (int i = 1; i <= 100000000; i++) {        sql.append(String.format("(%s),", i));        if (i % 10000 == 0) {            String s = sql.substring(0, sql.length() - 1);            sql = new StringBuilder("insert into test1(order_num) values ");            PreparedStatement ps = connection.prepareStatement(s);            ps.executeUpdate();            System.out.println(System.currentTimeMillis() + ":" + i);        }    }}
```

# **无条件查询(耗时24秒)**

耗时20多秒,如果给用户用,这个肯定是无法接受的。

```
mysql> select count(*) from test1;+-----------+| count(*)  |+-----------+| 100000000 |+-----------+1 row in set (23.95 sec)
```

# **走索引查询(耗时1毫秒)**

order_num 字段上面有索引,我们插入的时候,order_num 这个字段的值没有重复的。

用这个字段查询一下看看效果,**耗时1毫秒,快不快,你们说**???

```
select * from test1 where order_num = 9999999;
```

![image.png](https://img-blog.csdnimg.cn/img_convert/0756bde93a24a41b82f61a5d52106574.png)


# **走索引,范围查询(耗时1毫秒)**

```
select * from test1 where order_num >= 1000000 and order_num<= 1000010;
```

![image.png](https://img-blog.csdnimg.cn/img_convert/ee849fe7fb81d8fd6f0eebeecbab58ac.png)


# **结论**

1.  **不走索引,查询,这个基本上用不了,等着用户骂你吧。**
2.  **走索引,毫秒级响应,1亿数据根本不是问题,即使是10亿数据,速度也差不多,大家可以试试。**

# **再来个表,稍微复杂点**

# **创建test2表**

test2有3个字段,后面2个字段分别加了索引。

```
DROP TABLE IF EXISTS test2;CREATE TABLE test2(  id int PRIMARY KEY COMMENT '编号' auto_increment,  user_id bigint comment '用户id',  order_num bigint comment '订单号')COMMENT '用户表';/*user_id、order_num分别加索引*/create index idx1 on test2(user_id);create index idx2 on test2(order_num);
```

# **插入1亿数据**

100万user_id,每个user_id下面关联100个order_num,共1亿数据

```
@Testpublic void test2() throws SQLException, ClassNotFoundException {    Class.forName("com.mysql.jdbc.Driver");    Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/testdb?characterEncoding=UTF-8",            "root",            "密码");    StringBuilder sql = new StringBuilder("insert into test2(user_id,order_num) values ");    int count = 0;    for (int user_id = 1; user_id <= 1000000; user_id++) {        for (int num = 1; num <= 100; num++) {            sql.append(String.format("(%s,%s),", user_id, count));            count++;        }        if (count % 10000 == 0) {            String s = sql.substring(0, sql.length() - 1);            sql = new StringBuilder("insert into test2(user_id,order_num) values ");            PreparedStatement ps = connection.prepareStatement(s);            ps.executeUpdate();            System.out.println(System.currentTimeMillis() + ":" + count);        }    }}
```

# **无条件查询(耗时18秒)**

```
mysql> select count(*) from test2;+-----------+| count(*)  |+-----------+| 100000000 |+-----------+1 row in set (18.36 sec)
```

# **查询某个用户的数据(耗时1毫秒)**

```
select * from test2 where user_id = 100000;
```

查询出来了100条数据,耗时也就1毫秒。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JRw35fM2-1657539756794)(https://upload-images.jianshu.io/upload_images/19999858-b365987970e93ec3.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]


上面测试效果都是在我们笔记本上面的测试效果,如果放在线上去跑,数据会更好看!

# **总结一下**

1.  **mysql面对亿级别的数据到底行不行呢?看看上面的数据,不用我说了吧**
2.  mysql数据量上去之后,比如千万,亿级别,**如果不走索引,去查询,这个肯定是用不成的,用户是无法接受的。**
3.  mysql数据量大了,千万,亿级别,查询的时候,**带上条件,并且条件必须得走索引,那么速度是飞快的,毫秒级别的。**

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。