时间:2021-07-01 10:21:17 帮助过:4人阅读
之前做项目实在是太赶了,很多东西都没记录。是时候补回来了
MySQL做一个大表,由于要存历史记录,所以数据量很大,查询很慢。恰好查询的时候,又不需要时间太久的冷数据。现在将其实现原理提取成一个控制台小程序。
首先,创建一个简单的数据库访问类。
- <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> CommonDao
- {
- </span><span style="color: #0000ff;">private</span> <span style="color: #0000ff;">static</span> MySqlConnection conn = <span style="color: #0000ff;">new</span> MySqlConnection(ConfigurationManager.AppSettings[<span style="color: #800000;">"</span><span style="color: #800000;">DB</span><span style="color: #800000;">"</span>]); <span style="color: #008000;">//</span><span style="color: #008000;">创建连接</span>
- <span style="color: #808080;">///</span> <span style="color: #808080;"><summary></span>
- <span style="color: #808080;">///</span><span style="color: #008000;"> Insert Update Delete语句的执行
- </span><span style="color: #808080;">///</span> <span style="color: #808080;"></summary></span>
- <span style="color: #808080;">///</span> <span style="color: #808080;"><param name="SQL"></span><span style="color: #008000;">SQL语句</span><span style="color: #808080;"></param></span>
- <span style="color: #808080;">///</span> <span style="color: #808080;"><returns></span><span style="color: #008000;">返回影响行数</span><span style="color: #808080;"></returns></span>
- <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">int</span> ExecuteNonQuerySQL(<span style="color: #0000ff;">string</span><span style="color: #000000;"> SQL)
- {
- MySqlCommand cmd </span>=<span style="color: #000000;"> conn.CreateCommand();
- cmd.CommandText </span>=<span style="color: #000000;"> SQL;
- </span><span style="color: #0000ff;">if</span> (conn.State !=<span style="color: #000000;"> ConnectionState.Open)
- {
- conn.Open();
- }
- </span><span style="color: #0000ff;">int</span> Count =<span style="color: #000000;"> cmd.ExecuteNonQuery();
- conn.Close();
- </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> Count;
- }
- }</span>
由于是按分钟分表,所以写个定时器,每一分钟往里面插入5条数据:
- <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span> Main(<span style="color: #0000ff;">string</span><span style="color: #000000;">[] args)
- {
- </span><span style="color: #008000;">//</span><span style="color: #008000;">每分钟执行一次,插入5条数据</span>
- Timer t = <span style="color: #0000ff;">new</span> Timer(<span style="color: #800080;">60000</span><span style="color: #000000;">);
- t.Enabled </span>= <span style="color: #0000ff;">true</span>; <span style="color: #008000;">//</span><span style="color: #008000;">到达时间就执行一次,或者是持续执行</span>
- t.AutoReset = <span style="color: #0000ff;">true</span>; <span style="color: #008000;">//</span><span style="color: #008000;">一直执行</span>
- <span style="color: #000000;">
- t.Elapsed </span>+= (sender, eea) =><span style="color: #000000;">
- {
- </span><span style="color: #0000ff;">for</span> (<span style="color: #0000ff;">int</span> i = <span style="color: #800080;">0</span>; i < <span style="color: #800080;">5</span>; i++<span style="color: #000000;">)
- {
- DateTime dt </span>=<span style="color: #000000;"> DateTime.Now;
- </span><span style="color: #0000ff;">string</span> TableName = <span style="color: #800000;">"</span><span style="color: #800000;">person</span><span style="color: #800000;">"</span> + dt.ToString(<span style="color: #800000;">"</span><span style="color: #800000;">mm</span><span style="color: #800000;">"</span><span style="color: #000000;">);
- </span><span style="color: #0000ff;">string</span> sql = <span style="color: #800000;">"</span><span style="color: #800000;">INSERT INTO </span><span style="color: #800000;">"</span> + TableName + <span style="color: #800000;">"</span><span style="color: #800000;"> VALUES(null,‘superman‘,‘</span><span style="color: #800000;">"</span> + dt.ToString(<span style="color: #800000;">"</span><span style="color: #800000;">yyyy-MM-dd HH:mm:ss</span><span style="color: #800000;">"</span>) + <span style="color: #800000;">"</span><span style="color: #800000;">‘)</span><span style="color: #800000;">"</span><span style="color: #000000;">;
- </span><span style="color: #0000ff;">try</span><span style="color: #000000;">
- {
- CommonDao.ExecuteNonQuerySQL(sql);
- }
- </span><span style="color: #0000ff;">catch</span><span style="color: #000000;"> (Exception e)
- {
- MySqlException ex </span>= e <span style="color: #0000ff;">as</span><span style="color: #000000;"> MySqlException;
- </span><span style="color: #008000;">//</span><span style="color: #008000;">1146的代号就是表不存在的错误</span>
- <span style="color: #0000ff;">if</span> (ex.Number == <span style="color: #800080;">1146</span><span style="color: #000000;">)
- {
- </span><span style="color: #008000;">//</span><span style="color: #008000;">如果表不存在,则先创建这个表</span>
- <span style="color: #0000ff;">string</span> SQLCreateTable = <span style="color: #800000;">"</span><span style="color: #800000;">CREATE TABLE </span><span style="color: #800000;">"</span> + TableName + <span style="color: #800000;">"</span><span style="color: #800000;"> LIKE person</span><span style="color: #800000;">"</span>; <span style="color: #008000;">//</span><span style="color: #008000;">从模板表来创建新表,这样的好处是索引、自增什么的可以一次性建好</span>
- <span style="color: #000000;"> CommonDao.ExecuteNonQuerySQL(SQLCreateTable);
- }
- }
- }
- };
- Console.ReadKey();
- }</span>
第一张Person模板表的格式如下:
- <span style="color: #0000ff;">CREATE</span> <span style="color: #0000ff;">TABLE</span><span style="color: #000000;"> `person` (
- `Id` </span><span style="color: #0000ff;">int</span>(<span style="color: #800000; font-weight: bold;">11</span>) <span style="color: #808080;">NOT</span> <span style="color: #0000ff;">NULL</span><span style="color: #000000;"> AUTO_INCREMENT,
- `Name` </span><span style="color: #0000ff;">varchar</span>(<span style="color: #800000; font-weight: bold;">255</span>) <span style="color: #0000ff;">DEFAULT</span> <span style="color: #0000ff;">NULL</span><span style="color: #000000;">,
- `OperateTime` </span><span style="color: #0000ff;">datetime</span> <span style="color: #0000ff;">DEFAULT</span> <span style="color: #0000ff;">NULL</span><span style="color: #000000;">,
- </span><span style="color: #0000ff;">PRIMARY</span> <span style="color: #0000ff;">KEY</span><span style="color: #000000;"> (`Id`)
- ) ENGINE</span><span style="color: #808080;">=</span>InnoDB <span style="color: #0000ff;">DEFAULT</span> CHARSET<span style="color: #808080;">=</span>utf8;
于是就每分钟都会创建表并添加数据。
分表后有很多问题要处理,简单做两个,maybe会有其他问题。
1、数据在哪个表里;
2、数据跨表了,那么就需要表连接;
MySQL 按日期分表
标签: