最近在设计五分钟股票交易数据的小程序,发现如果将所有股票的数据都放在一张数据表中,会使得MYSQL的查询效率大大降低。
比如:使用SELECT COUNT(*) FROM STK.这样的一句代码执行了几分钟还没有结果,(实际上总共是五千万条记录左右)
因此考虑将股票数据分库分表存放。(当然能这种方法会导致在查找具体股票信息的时候稍微麻烦一些,但是效率应该会提升不少)
首先分库:构建mystkSH、mystkSZ、mystkHK、mystkOT分别存放上海、深证、香港和其他的交易数据。
其次分表:对于每只股票在指定的数据库中单独建一张表存放。比如在mystkSH数据库中新建SH000001表来存放上证 指数的交易数据。
当然啦,表不可能手动创建的嘛,不然几千只股票是会死人的,所以考虑在每个数据库中存放一张模板表,然后要创建每一只股票表格的时候只需要在里面执行代码即可:
Try
If myConn.State <> ConnectionState.Open Then myConn.Open()
myCommand = New MySqlCommand(" create table " & “股票名称” & " like 基本表;", myConn)
myCommand.ExecuteNonQuery()
Catch ex As Exception
'MsgBox(ex.Message)
End Try
然后再往创建好的表中replace数据即可。
但是,但是。。。。。
由于股票的表已经存在了,所以继续使用create table则会出错,因此在代码中使用了try来处理错误,如果已经存在,就不创建了。
但是这种做法违背了将错误交给程序的原则啊,所以我就考虑使用存储过程来创建表了。
首先判断该表是否已经存在了,如果存在,什么都不干;如果不存在,则创建表。但是,在存储过程中变量不能作为表名,否则创建的表就是以变量名为表名了:
-- --------------------------------------------------------------------------------
-- Routine DDL
-- Note: comments before and after the routine body will not be stored by the server
-- --------------------------------------------------------------------------------
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `CREATE_TABLE`(IN T_NAME VARCHAR(20))
BEGIN
declare p_count int;
set @p_count=(select count(*) from information_schema.tables where table_name=@T_NAME and table_schema='mystk');
if @p_count=0 then
create table T_name like 5m;
create table T_NAME SELECT * FROM 5m WHERE 1=2;
END IF;
END
对上述存储过程:CREATE_TABLE('SH000001')创建的表不是SH000001,而是叫T_NAME。网上已有解决方案,但是我这边不行啊。
有人说可以用下面的方式,但是我还是出错:
-- --------------------------------------------------------------------------------
-- Routine DDL
-- Note: comments before and after the routine body will not be stored by the server
-- --------------------------------------------------------------------------------
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `CREATE_TABLE`(IN T_NAME VARCHAR(20))
BEGIN
declare p_count int;
set @p_count=(select count(*) from information_schema.tables where table_name=@T_NAME and table_schema='mystk');
if @p_count=0 then
set @csql = concat("create table ",@T_NAME , " SELECT * FROM 5m WHERE 1=2;");
prepare create_stmt from @csql;
EXECUTE create_stmt;
END IF;
END
mysql设计股票数据库_【笔记】菜鸟制作:设计股票交易数据在MYSQL中的表设计(表结构复制 表数据复制)...