Mysql配置
修改配置文件:
sudo vim /etc/mysql/my.cnf
, 避免插入數(shù)據(jù)時出現(xiàn)內(nèi)存表is full的錯誤。
添加如下內(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)建一個商品數(shù)據(jù)表goods,
商品分類表和商品品牌表需要獨立建的,
這里添加到商品表里面,是為了測試分表
操作對查詢性能的影響,請忽視。
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 '商品價格',
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)建時間',
update_time INT(11) NOT NULL DEFaULT 0 COMMENT '更新時間',
PRIMARY KEY(goods_id)
# INDEX order_index (`goods_order`) 暫時不加索引,優(yōu)化的時候再加, 測試性能差別
)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 '商品價格',
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)建時間',
update_time INT(11) NOT NULL DEFaULT 0 COMMENT '更新時間',
PRIMARY KEY(goods_id)
# INDEX order_index (goods_order) 暫時不加索引,優(yōu)化的時候再加, 測試性能差別
)ENGINE = MEMORY AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8 COMMENT '內(nèi)存商品表';
創(chuàng)建存儲過程
使用存儲過程的插入速度較快,原因在與存儲過程預編譯并保存在數(shù)據(jù)庫中,而SQL運行過程需要經(jīng)歷幾個階段。
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上場了
# _*_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)用存儲過程插入數(shù)據(jù)
:param num: 需要生成的數(shù)據(jù)條數(shù)
:return:
"""
brands = ['華為', '小米', '中興', '華碩', '戴爾', '三星', '金士頓', '耐克', '新百倫']
categories = ['手機', '電腦', '配件', '箱包', '服飾', '鞋子', '家具']
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)用存儲過程插入數(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()
內(nèi)存表數(shù)據(jù)插入到普通表
內(nèi)存表可能一次存不了1千萬, 測試大概需要6G內(nèi)存左右
可以重復執(zhí)行Python腳本,插入普通表和清空內(nèi)存表步驟,內(nèi)存夠大的請忽略。
INSERT INTO goods SELECT * FROM goods_memory
個人博客
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
