黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

python mysql 存儲(chǔ)過程 快速生成千萬級(jí)測(cè)試數(shù)據(jù)

系統(tǒng) 2176 0
原文鏈接: http://blog.fenlanli.com/articles/2019/08/20/1566293147402.html

python mysql 存儲(chǔ)過程 快速生成千萬級(jí)測(cè)試數(shù)據(jù)_第1張圖片

Mysql配置

修改配置文件: sudo vim /etc/mysql/my.cnf ,  避免插入數(shù)據(jù)時(shí)出現(xiàn)內(nèi)存表is full的錯(cuò)誤。
添加如下內(nèi)容:

            
              [mysqld]
# 避免內(nèi)存表if full, 自行設(shè)置
max_heap_table_size = 4096M

            
          

重啟mysql服務(wù): sudo service mysql restart

創(chuàng)建數(shù)據(jù)表

創(chuàng)建一個(gè)商品數(shù)據(jù)表goods,
商品分類表和商品品牌表需要獨(dú)立建的,
這里添加到商品表里面,是為了測(cè)試分表
操作對(duì)查詢性能的影響,請(qǐng)忽視。

InnoDb引擎表

            
              DROP TABLE IF EXISTS goods;
CREATE TABLE goods
(
   goods_id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
   goods_name VARCHAR(30) NOT NULL DEFAULT '' COMMENT '商品名稱',
   goods_price DECIMAL(10, 2) NOT NULL DEFAULT 0.0 COMMENT '商品價(jià)格',
   goods_cate VARCHAR(30) NOT NULL DEFAULT ''  COMMENT '商品分類名稱',
   goods_brand VARCHAR(30) NOT NULL DEFAULT '' COMMENT '商品品牌名稱',
   goods_order TINYINT(1) NOT NULL DEFAULT 0 COMMENT '排序字段',
   create_time INT(11) NOT NULL DEFaULT 0 COMMENT '創(chuàng)建時(shí)間',
   update_time INT(11) NOT NULL DEFaULT 0 COMMENT '更新時(shí)間',
   PRIMARY KEY(goods_id)
   # INDEX order_index (`goods_order`) 暫時(shí)不加索引,優(yōu)化的時(shí)候再加, 測(cè)試性能差別
)ENGINE = INNODB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8 COMMENT '商品表';

            
          

Memory引擎表

            
              DROP TABLE IF EXISTS goods_memory;
CREATE TABLE goods_memory
(
   goods_id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
   goods_name VARCHAR(30) NOT NULL DEFAULT '' COMMENT '商品名稱',
   goods_price DECIMAL(10, 2) NOT NULL DEFAULT 0.0 COMMENT '商品價(jià)格',
   goods_cate VARCHAR(30) NOT NULL DEFAULT ''  COMMENT '商品分類名稱',
   goods_brand VARCHAR(30) NOT NULL DEFAULT '' COMMENT '商品品牌名稱',
   goods_order TINYINT(1) NOT NULL DEFAULT 0 COMMENT '排序字段',
   create_time INT(11) NOT NULL DEFaULT 0 COMMENT '創(chuàng)建時(shí)間',
   update_time INT(11) NOT NULL DEFaULT 0 COMMENT '更新時(shí)間',
	 PRIMARY KEY(goods_id)
	 # INDEX order_index (goods_order) 暫時(shí)不加索引,優(yōu)化的時(shí)候再加, 測(cè)試性能差別
)ENGINE = MEMORY AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8 COMMENT '內(nèi)存商品表';

            
          

創(chuàng)建存儲(chǔ)過程

使用存儲(chǔ)過程的插入速度較快,原因在與存儲(chǔ)過程預(yù)編譯并保存在數(shù)據(jù)庫(kù)中,而SQL運(yùn)行過程需要經(jīng)歷幾個(gè)階段。

            
              CREATE DEFINER=`root`@`localhost` PROCEDURE `add_goods`(
    IN g_name VARCHAR (30),
    IN g_price DECIMAL(10, 2),
    IN g_cate VARCHAR(30),
    IN g_brand VARCHAR(30),
    IN g_order TINYINT(1),
    IN c_time INT(11),
    IN u_time INT(11)
    )
BEGIN  
   INSERT INTO goods_memory(goods_name, goods_price, goods_cate, goods_brand, goods_order, create_time, update_time)
    VALUES( g_name, g_price, g_cate, g_brand, g_order, c_time, u_time);
END

            
          

該除了不能生孩子的Python上場(chǎng)了

            
              # _*_coding:utf-8_*_
"""
File: main.py
Time: 2019/8/20 21:07
Author: ClassmateLin
Email: 406728295@qq.com
Desc: 
"""
import asyncio
import aiomysql
import random
import decimal
import time

pool = ''


async def consumer(num: int):
    """
    生成數(shù)據(jù),并調(diào)用存儲(chǔ)過程插入數(shù)據(jù)
    :param num: 需要生成的數(shù)據(jù)條數(shù)
    :return: 
    """
    brands = ['華為', '小米', '中興', '華碩', '戴爾', '三星', '金士頓', '耐克', '新百倫']
    categories = ['手機(jī)', '電腦', '配件', '箱包', '服飾', '鞋子', '家具']
    for i in range(num):
        async with pool.acquire() as conn:
            async with conn.cursor() as cur:
                try:
                    goods_name = '商品' + str(i)
                    goods_cate = random.choice(categories)
                    goods_brand = random.choice(brands)
                    goods_order = random.randint(0, 9)
                    goods_price = decimal.Decimal(random.randint(100, 1000000))
                    create_time = update_time = time.time()
                    # 調(diào)用存儲(chǔ)過程插入數(shù)據(jù)到內(nèi)存表
                    await cur.callproc('add_goods', (goods_name, goods_price, goods_cate,
                                                     goods_brand, goods_order, create_time, update_time))
                    print('插入第{}條數(shù)據(jù)成功'.format(str(i)))
                except aiomysql.Error as e:
                    print('mysql error {}: {}'.format(e.args[0], e.args[1]))


async def main(loop, num):
    global pool
    database = {
        'host': '127.0.0.1',
        'port': 3306,
        'user': 'root',
        'password': 'root',
        'db': 'test',
        'loop': loop,
        'charset': 'utf8',
        'autocommit': True
    }
    pool = await aiomysql.create_pool(**database)
    asyncio.ensure_future(consumer(num))

if __name__ == '__main__':
    max_num = 10000 * 1000  # 1千萬
    loop = asyncio.get_event_loop()
    asyncio.ensure_future(main(loop, max_num))
    loop.run_forever()

            
          

python mysql 存儲(chǔ)過程 快速生成千萬級(jí)測(cè)試數(shù)據(jù)_第2張圖片

內(nèi)存表數(shù)據(jù)插入到普通表

內(nèi)存表可能一次存不了1千萬, 測(cè)試大概需要6G內(nèi)存左右
可以重復(fù)執(zhí)行Python腳本,插入普通表和清空內(nèi)存表步驟,內(nèi)存夠大的請(qǐng)忽略。
INSERT INTO goods SELECT * FROM goods_memory

個(gè)人博客


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論