数据库中亿级数据要求检索秒级返回

这篇具有很好参考价值的文章主要介绍了数据库中亿级数据要求检索秒级返回。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

提示:最近有个新需求,需要在mysql数据库中插入亿级数据,同时在查询时要求秒级返回。我的想法是第一步要在数据库中插入亿级数据,第二步给字段加索引以达到查询秒级返回的效果。


前言

亿级数据的秒级返回,比较困难的是快速在数据库中插入亿级数据,所以这一步花了很多时间来处理。下面分两步来进行,第一步插入亿级数据,第二步给字段增加索引。注意,建表时不要加索引,这样会让insert执行时慢很多。


提示:以下是本篇文章正文内容,下面案例可供参考

一、在mysql数据库中建表,并插入亿级数据

假设插入1000W条数据,如果没有索引,可能只需要生成1G的空间,如果有了索引,那么可能额外再生成0.5G的索引数据,同时mysql服务器还要计算这些索引,因此,如果表存在索引,插入数据时,受CPU计算索引数据及硬盘写入索引数据的影响,会更慢。所以先建表。

1.建表语句

代码如下(示例):

DROP TABLE IF EXISTS `k_user`;
CREATE TABLE `k_user`  (
  `id` int(0) NOT NULL AUTO_INCREMENT,
  `name` varchar(45) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL COMMENT '账号',
  `pass_word` varchar(45) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '密码',
  `nick_name` varchar(45) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '昵称',
  `create_time` datetime(0) DEFAULT NULL COMMENT '创建时间',
  `phone` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '手机号码',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 356 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

2.插入亿级数据

首先尝试过用java插入数据,结果非常慢,代码就不贴了;后面选择的用python来造数据,前提要有python环境。
代码如下(示例):

# 向mysql的数据库表中插入1亿条数据
import MySQLdb
import MySQLdb.cursors
import random
import time

# 批量插的次数
loop_count = 10000
# 每次批量查的数据量
batch_size = 10000
success_count = 0
fails_count = 0
# 数据库的连接
# 使用 SSCursor (流式游标),避免客户端占用大量内存。(这个 cursor 实际上没有缓存下来任何数据,它不会读取所有所有到内存中,它的做法是从储存块中读取记录,并且一条一条返回给你。)
conn = MySQLdb.connect(host="{IP}",
                       user="{帐号}",
                       passwd="{密码}",
                       db="{数据库名}",
                       port="{端口}",
                       cursorclass=MySQLdb.cursors.SSCursor)
chars = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz'
digits = '0123456789'


def random_generate_string(length):
    return ''.join(random.sample(chars, length))


def random_generate_number(length):
    if length > len(digits):
        digit_list = random.sample(digits, len(digits))
        digit_list.append(random.choice(digits))
        return ''.join(digit_list)
    return ''.join(random.sample(digits, length))


def random_generate_data(num):
    c = [num]
    phone_num = 13100000000

    def _random_generate_data():
        c[0] += 1
        return (c[0], "name_" + str(random.randrange(100000)),
                random_generate_string(20),
                "nick_name_" + str(random.randrange(100000)), 
                time.strftime("%Y-%m-%d %H:%M:%S"),
                phone_num + c[0],)

    return _random_generate_data


def execute_many(insert_sql, batch_data):
    global success_count, fails_count
    cursor = conn.cursor()
    try:
        cursor.executemany(insert_sql, batch_data)
    except Exception as e:
        conn.rollback()
        fails_count = fails_count + len(batch_data)
        print(e)
        raise
    else:
        conn.commit()
        success_count = success_count + len(batch_data)
        print(str(success_count) + " commit")
    finally:
        cursor.close()


try:
    # user表列的数量
    column_count = 6

    # 插入的SQL
    insert_sql = "replace into k_user(id, name, pass_word, nick_name, create_time, phone) values (" + ",".join(
        ["%s" for x in range(column_count)]) + ")"
    batch_count = 0
    begin_time = time.time()
    for x in range(loop_count):
        batch_count = x * batch_size + 1
        # print(batch_count)
        gen_fun = random_generate_data(batch_count)
        batch_data = [gen_fun() for x in range(batch_size)]
        execute_many(insert_sql, batch_data)
    end_time = time.time()
    total_sec = end_time - begin_time
    qps = success_count / total_sec
    print("总共生成数据: " + str(success_count))
    print("总共耗时(s): " + str(total_sec))
    print("QPS: " + str(qps))
except Exception as e:
    print(e)
    raise
else:
    pass
finally:
    pass

二、亿级数据插入完毕后,按需添加索引

1.按需增加索引

1.添加primary key(主键索引)
alter table k_user add primary key(id);

2.添加unique(唯一索引)
alter table k_user add unique(name);

3.添加index(普通索引)
alter table k_user add index (index_name) (nick_name);

4.添加fulltext(全文索引)
alter table k_user add fulltext (create_time);

5.添加多列索引
alter table 表名 add index 索引名(index_name) (列名1,列名2…);

2.秒级返回

数据库中亿级数据要求检索秒级返回

总结

以上就是今天要讲的内容,本文简单介绍了亿级数据秒级返回的实现,希望能对大家有所帮助。

本文参考的原文链接:https://blog.csdn.net/weixin_44984864/article/details/107141534

原文建表加了索引,insert非常慢,此文已经改良,能较快实现数据库中insert亿级数据。文章来源地址https://www.toymoban.com/news/detail-435265.html

到了这里,关于数据库中亿级数据要求检索秒级返回的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 万字详解PHP+Sphinx中文亿级数据全文检索实战(实测亿级数据0.1秒搜索耗时)

    Sphinx查询性能非常厉害,亿级数据下输入,大部分能在0.01~0.1秒,少部分再5秒之内查出数据。 官方文档:http://sphinxsearch.com/docs/sphinx3.html 极简概括: 由C++编写的高性能全文搜索引擎的开源组件,C/S架构,跨平台(支持Linux、Windows、MacOS),支持分布式部署,并可直接适

    2024年04月08日
    浏览(31)
  • 基于数据库的全文检索实现

    对于内容摘要,信件内容进行全文检索 基于SpringBoot 2.5.6+Postgresql+jpa+hibernate实现 登记保存之后,处理完成业务逻辑,发送全文检索事件 处理业务发送全文检索事件 统一处理全文检索事件 sql大致就是这样的逻辑 事件处理机制请看另一篇文章 自定义事件处理机制

    2024年03月12日
    浏览(37)
  • 精8千多中药数据库检索ACCESS\EXCEL数据库

    这是一份最好的中药数据库,不但字段内容最为详细,而且记录数也是最多的,字段包含:药名、别名、汉语拼音、拉丁文名、英文名、拉丁植物动物矿物名、性味、归经、功效、主治、用法用量、用药禁忌、功效分类、药理作用、中药化学成分、选方、各家论述、考证、科

    2024年02月07日
    浏览(35)
  • GBASE南大通用数据库如何检索单行

    SELECT 语句返回的行集是它的活动集。单个 SELECT 语句返回单个行。您可使用嵌入式 SELECT 语句来从数据库将单个行检索到主变量内。然而,当 SELECT 语句返回多行数 据时,程序必须使用游标来一次检索一行。在 检索多行 中讨论“多行”选择操作。 要检索单行数据,只要在您

    2024年01月21日
    浏览(39)
  • 创建数据库Market、Team,按要求完成指定操作

    创建数据库Market,在Market中创建数据表customers,customers表结构如表4.6所示,按要求进行操作。  代码如下: 在Market中创建数据表orders,orders表结构如表4.7所示,按要求进行操作。 代码如下: 在关联customers_info 表中的主键c_num时,orders表中的c_id和customers_info表中的c_num 的类型

    2024年02月13日
    浏览(33)
  • 京东APP百亿级商品与车关系数据检索实践

    本文主要讲解了京东百亿级商品车型适配数据存储结构设计以及怎样实现适配接口的高性能查询。通过京东百亿级数据缓存架构设计实践案例,简单剖析了jimdb的位图(bitmap)函数和lua脚本应用在高性能场景。希望通过本文,读者可以对缓存的内部结构知识有一定了解,并且能够

    2024年02月03日
    浏览(26)
  • 《向量数据库》——怎么安装向量检索库Faiss?

    装 Faiss   以下教程将展示如何在 Linux 系统上安装 Faiss:   1. 安装 Conda。   在安装 Faiss 之前,先在系统上安装 Conda。Conda 是一个开源软件包和环境管理系统,可在 Windows、macOS 和 Linux 操作系统上运行。根据以下步骤在 Linux 系统上安装 Conda。   2. 从官网下载 Miniconda 安装包(

    2024年02月13日
    浏览(23)
  • 【向量数据库】相似向量检索Faiss数据库的安装及余弦相似度计算(C++)

    Faiss 是一个强大的向量相似度搜索库,具有以下优点: 高效的搜索性能:Faiss 在处理大规模向量数据时表现出色。它利用了高度优化的索引结构和近似搜索算法,可以快速地执行最近邻搜索和相似度匹配,具有很低的查询延迟。 高度可扩展:Faiss 提供了多种索引结构和算法

    2024年02月07日
    浏览(39)
  • 人文社科类文献去哪些数据库检索下载

    查找下载人文社科类文献的数据库大盘点: 1、文献党下载器(wxdown.org) 大型文献馆,几乎整合汇集了所有中外文献数据库资源,可附带权限进入文献数据库查找下载文献,覆盖全科包括查找下载人文社科类文献的众多数据库资源(例如下面这些文献数据库资源)。  2、J

    2024年02月03日
    浏览(36)
  • 向量数据库:usearch的简单使用+实现图片检索应用

    usearch是快速开源搜索和聚类引擎×,用于C++、C、Python、JavaScript、Rust、Java、Objective-C、Swift、C#、GoLang和Wolfram 🔍中的向量和🔜字符串× 一个简单的例子(注:本例子在运行时向index中不断添加项目,并将最后的index持久化为一个文件,在运行时由于添加项目内存占用会不断增

    2024年02月02日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包