【メモ】菜鳥製作:MYSQLにおける株式取引データの表設計(表構造複製、表データ複製)


最近、5分間の株式取引データを設計した小さなプログラムでは、すべての株式のデータを1枚のデータテーブルに置くと、MYSQLのクエリー効率が大幅に低下することが分かった.
例えば、SELECT COUNT(*)FROM STK.というコードを使って数分実行してもまだ結果が出ていません.
そのため、株式データライブラリの表を保存することを考慮します.(もちろん、この方法は具体的な株の情報を探すときに少し面倒になりますが、効率が向上するはずです)
まずライブラリを分けます:mystkSH、mystkSZ、mystkHK、mystkOTを構築してそれぞれ上海、深証、香港とその他の取引データを保存します.
次の表:各株について、指定したデータベースに個別に表を作成して保存します.例えばmystkSHデータベースにSH 000001テーブルを新規作成し、上証指数の取引データを格納します.
もちろん、表は手動で作成することはできません.そうしないと、数千株が死ぬので、データベースごとにテンプレート表を保存し、各株表を作成するときはVBだけが必要です.Netでコードを実行すればいいです.
                 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('SH 000001')が作成したテーブルはSH 000001ではなく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